DropDownListFor`sSelected值适用于ViewModel但不适用于整数

时间:2012-10-13 21:18:52

标签: c# asp.net-mvc html.dropdownlistfor

当我在下拉列表中选择模板并按下确定按钮制作表单后,将创建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();
}

1 个答案:

答案 0 :(得分:0)

嗯,一个int不能真正获得非值。将您的删除方法更改为接受并int?

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