当我在下拉列表中选择模板并按下确定按钮制作表单后,将创建DeleteTemplateListViewModel对象并使用当前templateId填充,并且ModelState为Valid。
当我在下拉列表中选择默认值“选择模板”并按下确定按钮以创建表格后,将创建DeleteTemplateListViewModel对象,并且ModelState为InValid。
到目前为止一切顺利。
但是当我将Delete操作更改为接受一个整数,即selectedTemplateId时,ModelState对于选定的templateId是有效的。当我选择DropDownListFor中定义的默认值“选择模板”时,我会在输出窗口中看到此异常:
System.Web.Mvc.dll中出现'System.ArgumentException'类型的第一次机会异常
如何使用整数作为操作参数而不是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; }
}
WORKS
[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();
}
答案 0 :(得分:0)
嗯,一个int不能真正获得非值。将您的删除方法更改为接受并int?
。
我不知道什么样的模型验证MVC可以做一个int?没有其他数据,但你应该检查它是否为空。