ドロップダウンリストをビューに表示したいので、ドロップダウンリストに入力するエントリのリストをビューに送信するモデル(ExampleAddSetupDto)に含めます。これは正常に機能しますが、検証エラーが発生し、受信モデルでビューを再表示すると、リストがnullになります。
私のアクションを以下に示します(注:ModelState.IsValidが失敗した場合に問題が発生します)。また、Autofacを使用して適切なサービスをメソッドに注入しているため、Actionメソッドの2番目のパラメーターが奇妙に見える場合があります)。
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Add(ExampleAddSetupDto add, IServiceAddCommit<IExampleAddSetupDto, IExampleAddCommitDto> service)
{
if (ModelState.IsValid)
{
var response = service.Create(add);
if (response.IsValid)
{
TempData["message"] = "You successfully added a new Example Entry";
return View("AddSuccess", response);
}
//else errors, so copy the errors over to the ModelState
response.CopyErrorsToModelState(ModelState, add);
}
// Some validation error, so redisplay same view
return View(add);
}
私のモデルは次のようになります。
public class ExampleAddSetupDto : IExampleAddSetupDto
{
[StringLength(50, MinimumLength = 2)]
public string Name { get; set; }
public int Option1Id { get; set; }
public int Option2Id { get; set; }
//-----------------------------
//now the properties for the drop down lists
public IList<Option1> PosibleEntriesForOption1 { get; set; }
public IList<Option2> PosibleEntriesForOption2 { get; set; }
}
私の見解は:
@model ServiceLayer.Example.DTOs.ExampleAddSetupDto
@{
ViewBag.Title = "Add";
}
<h2>Add</h2>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<fieldset>
<legend>Add an Example item</legend>
<div class="editor-label">
@Html.LabelFor(model => model.Name)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Name)
@Html.ValidationMessageFor(model => model.Name)
</div>
<div class="editor-field">
@Html.Label("Option1")
@Html.DropDownListFor(model => model.Option1Id, new SelectList(Model.PosibleEntriesForOption1, "Option1Id", "OptionText"))
@Html.ValidationMessageFor(model => model.Option1Id)
</div>
<div class="editor-field">
@Html.Label("Option2")
@Html.DropDownListFor(model => model.Option2Id, new SelectList(Model.PosibleEntriesForOption2, "Option2Id", "OptionText"))
@Html.ValidationMessageFor(model => model.Option2Id)
</div>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
}
Model.PosibleEntriesForOptionをフォームとともに返す必要があることを理解しています。ビューでHtml.HiddenForヘルパーを使用して、リストを返してみました。
@Html.HiddenFor(model => model.PosibleEntriesForOption1)
しかし、これはエラーをスローします'値'System.Collections.Generic.List`1[DataClasses.ExampleClasses.Option1]'は無効です。
明らかに私はここで何かが欠けているので、モデルを再表示してもエラーが発生しないようにリストを返す方法についてアドバイスをいただければ幸いです。