ModelState.IsValid表示不必要的字段名称

时间:2014-01-13 16:17:01

标签: asp.net-mvc html.dropdownlistfor modelstate

我有一个非常简单的模型。我有一个位置有2个字段,Id和Name。我有InventoryItems,它有许多标量字段,其FK位于存储它的位置。我有一个用于创建InventoryItem的视图。该视图的下拉为“

<div class="editor-label">
    @Html.LabelFor(model => model.Location)
</div>
<div class="editor-field">
    @Html.DropDownListFor(model => model.Location.Id, new SelectList(ViewBag.Locations, "Id", "Name"))
</div>

控制器代码检查返回false的ModelState.IsValid,因为ModelState中位置的NAME为空。我真的只需要Id来保存InventoryItem。但是我在“位置名称”字段中有[必需],因为当我允许添加位置时,我希望需要该字段。

有人能告诉我在MVC设计模式中处理这个问题的正确方法吗?

2 个答案:

答案 0 :(得分:0)

如果在此之前已经设置了名称,您可以使用@ Html.HiddenFor()隐藏页面上的名称,它保留HttpPost的值。

如果不是这种情况,那么我建议在模型中删除所需的名称要求并在View Model上使用它,这样你就可以有两个不同级别的验证,只需要记住你需要确保如果字段没有在需要的位置填充,则会出错。

我个人会在您更改验证要求时使用View Models

答案 1 :(得分:0)

最好的方法是使用ViewModel,它只包含UI端所需的字段,然后转换为控制器中的实际Model。

在您的情况下,您可以在视图/表单中使用LocationLink,只需要ID:

public class LocationLink
{
    [Required(ErrorMessage = "No id provided")]
    public string Id { get; set; }
}

然后在您的控制器中,使用提供的Id从数据存储中加载相应的Location,并将其添加到父模型。

通常你应该有一个ViewModel for Display包含所有字段(Location带有Id和Name)和一个ViewModel用于创建/编辑表单(LocationLink在这种情况下只有Id)。