ドロップダウン リストでテンプレートを選択し、[OK] ボタンを押してフォームを投稿すると、DeleteTemplateListViewModel オブジェクトが作成され、現在の templateId が入力され、ModelState が有効になります。
ドロップダウン リストでデフォルト値の [テンプレートを選択] を選択し、[OK] ボタンを押してフォーム ポストを作成すると、DeleteTemplateListViewModel オブジェクトが作成され、ModelState が InValid になります。
ここまでは順調ですね。
しかし、削除アクションを変更して、selectedTemplateId である整数を受け入れるようにすると、選択した templateId に対して ModelState が有効になります。DropDownListFor で定義されているデフォルト値「テンプレートを選択」を選択すると、出力ウィンドウに次の例外が表示されます。
タイプ 'System.ArgumentException' の初回例外が System.Web.Mvc.dll で発生しました
viewModel の代わりにアクション パラメータとして整数を使用して、デフォルト値に対して ModelState が false/Invalid になるようにするにはどうすればよいですか?
@model ITMS.Web.Models.DeleteTemplateListViewModel
@using (Html.BeginForm("Delete", "Template"))
{
@Html.ValidationSummary(false)
@Html.DropDownListFor(x => x.SelectedTemplateId,
new SelectList(Model.DisplayList, "TemplateId", "Name"),
"Select a template",
new { @class = "listviewmodel" })
}
public class DeleteTemplateListViewModel
{
[Required(ErrorMessage = "No template selected.")]
public int SelectedTemplateId { get; set; }
public string Name { get; set; }
public IEnumerable<TemplateViewModel> DisplayList { get; set; }
}
作品
[HttpPost]
public ActionResult Delete(DeleteTemplateListViewModel viewModel)
{
if (ModelState.IsValid)
{
int templateId = viewModel.SelectedTemplateId;
_templateDataProvider.DeleteTemplate(templateId);
return new JsonNetResult(new { success = true, templateId = templateId });
}
return LoadDeleteTemplates();
}
動作しません
[HttpPost]
public ActionResult Delete(int selectedTemplateId)
{
if (ModelState.IsValid)
{
_templateDataProvider.DeleteTemplate(selectedTemplateId);
return new JsonNetResult(new { success = true, templateId = selectedTemplateId});
}
return LoadDeleteTemplates();
}