我有一个非常简单的模型。我有一个位置有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设计模式中处理这个问题的正确方法吗?
答案 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)。