【问题标题】:DropDownListFor`s Selected value works with ViewModel but not integerDropDownListFor`s ​​Selected 值适用于 ViewModel 但不适用于整数
【发布时间】:2012-10-13 21:18:52
【问题描述】:

当我在我的下拉列表中选择一个模板并按 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();
}

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 即使我在 View 中将 SelectedTemplateId 的整数设为可为空,并且操作参数为 Null 但 Modelstate 为真...我不会从控制器中的 NULL 检查开始。这应该通过验证来处理。正如我之前所说,当我使用 viewModel 作为操作参数时,它的工作原理对我来说似乎是开销。
    • 那是因为一个int?不是模型。也许您应该研究自定义验证,或者只是制作一个包含单个 int 的模型?财产。
    • 你对我说的话毫无意义。你让我困惑。我做了一个int?但它对int没有帮助?动作的参数。
    • 我认为问题不在于验证,而在于模型绑定过程,所以也许我应该编写一个自定义模型绑定器?
    • 我将 SelectedTemplateId 设为可空,并且将操作参数设为可空。当我执行 httppost 并且我的 selecteditem 列表为空时,SelectedTemplateId 操作参数为空,但 M​​odelState.IsValid 始终为 TRUE ???我怎样才能告诉用户选择任何东西?我不想在控制器中进行空检查...
    猜你喜欢
    • 2017-08-02
    • 1970-01-01
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    • 2018-07-05
    相关资源
    最近更新 更多