0

当我在下拉列表中选择一个模板并按 OK 按钮发布一个表单时,将创建 DeleteTemplateListViewModel 对象并用当前的 templateId 填充,并且 ModelState 是有效的。

当我在下拉列表中选择默认值“选择模板”并按 OK 按钮以发布表单时,将创建 DeleteTemplateListViewModel 对象并且 ModelState 为 InValid。

到目前为止,一切都很好。

但是,当我将删除操作更改为接受一个作为 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; }
}

作品

[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();
}
4

1 回答 1

0

嗯,一个 int 不能真正得到一个非值。将您的 Delete 方法更改为接受和int?.

不知道 MVC 可以做一个 int 什么样的模型验证?没有其他数据,但您应该检查它是否为空。

于 2012-10-13T22:00:55.760 回答