私がやろうとしていることは本当に簡単であるべきだと思います(そしてそれは私を愚かに感じさせます)が、私はそれを理解できないので、HTTP POSTの方法を理解していないと思います.
コントローラーは QuoteDimensionViewModel QDVM を作成し、それをビューに送信します。ビューは、モデル内のさまざまな変数のテキスト ボックスを含む Web ページを作成します。ユーザーはそれらのテキストボックスに入力します。ユーザーが HTTP ポストを生成するボタンをクリックすると、モデルがテキストボックスからの新しい値で更新され、コントローラーに送信されます。コントローラーはそれを行い、私たちは皆幸せに暮らしています.
ユーザーがボタンを押すと、新しい QuoteDimensionViewModel が作成され、それらに関連付けられたテキスト ボックスを持つ値のみが入力されます。したがって、この場合、変数 Eid のテキスト ボックスがないため、Eid の値は Get で 5 になる可能性がありますが、Post の値は常に 0 です。これにより、IValidatableObject でデータを検証しようとすると問題が発生します。
TLDR; 基本的に、X 変数を持つモデルをビューに送信し、それらの変数の Y を変更したいと考えています。更新されたモデルを変更で検証し、コントローラーに POST で戻します。
助けと提案をありがとう
まずモデル:
public class QuoteDimensionViewModel
{
private QuoteDatabaseEntities Quotedb = new QuoteDatabaseEntities();
[Required]
public string ShowerImage { get; set; }
[Required]
public EnclosureDimension EnclosureDimensions { get; set; } \\Wrapper class
[Required]
public QuoteDimensionsWrapper QuoteDimensions { get; set; } \\Wrapper class
[Required]
public int Eid { get; set; }
[Required]
public int Sid { get; set; }
[Required]
public int Hid { get; set; }
[Required]
public int Gid { get; set; }
public QuoteDimensionViewModel(){ }
public QuoteDimensionViewModel(int eid, int sid, int hid, int gid)
{
Eid = eid;
Sid = sid;
Hid = hid;
Gid = gid;
this.ShowerImage = (from x in Quotedb.Showers
where x.ID == Sid
select x.Picture ).Single();
this.EnclosureDimensions = (from x in Quotedb.EnclosureDimensions
where (x.Enclosure_ID_FK == Eid)
select x).Single();
this.QuoteDimensions = new QuoteDimensionsWrapper(Eid);
}
}
public class QuoteDimensionsWrapper: IValidatableObject
{
public int Eid { get; set; }
public int ID { get; set; }
public int Quote_ID_FK { get; set; }
public double Height { get; set; }
public double Width { get; set; }
public QuoteDimensionsWrapper(int eid)
{
Eid = eid;
}
public QuoteDimensionsWrapper()
{
}
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
\\Validation stuff based on the value of Eid
}
今コントローラ:
public class QuoteDimensionViewModelController : Controller
{
public ActionResult Quote(int Eid, int Sid, int Hid, int Gid)
{
QuoteDimensionViewModel QDVM = new QuoteDimensionViewModel(Eid, Sid, Hid, Gid);
return View(QDVM);
}
[InitializeSimpleMembership]
[HttpPost]
public ActionResult Quote(QuoteDimensionViewModel QDVM)
{
//Validate the Data then write it to a database
return RedirectToAction("Index", "QuoteViewModel", new { id = myQid });
}
}
}
そしてビュー:
@model QuoteWebApp.Models.ViewModels.QuoteDimensionViewModel
@{
ViewBag.Title = "Quote";
}
<h2>Dimensions</h2>
<img src=@Url.Content(Model.ShowerImage) alt="Image" />
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>QuoteDimensions</legend>
<div class="editor-label">
@Html.LabelFor(model =>model.QuoteDimensions.Height)
</div>
<div class="editor-field">
@Html.EditorFor(model =>model.QuoteDimensions.Height)
@Html.ValidationMessageFor(model =>model.QuoteDimensions.Height)
</div>
<div class="editor-label">
@Html.LabelFor(model =>model.QuoteDimensions.Width)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.QuoteDimensions.Width)
@Html.ValidationMessageFor(model => model.QuoteDimensions.Width)
</div>
<div class="editor-label">
@Html.LabelFor(model =>model.QuoteDimensions.DoorWidth)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.QuoteDimensions.Width)
@Html.ValidationMessageFor(model => model.QuoteDimensions.Width)
</div>
}
<p>
<input type="submit" value="Quote" />
</p>
</fieldset>
}
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}