是否可以在不验证"MVC-3"的情况下验证MVC-3模型;子模型"
本文关键字:quot 模型 MVC-3 验证 情况下 是否 | 更新日期: 2023-09-27 18:02:03
我有一个类需要指定另一个类,但我不希望MVC ModelState验证器检查辅助模型是否有效。这可能吗?
这里有一个简单的概述:
我的实体看起来像这样:
public class WidgetType
{
public long Id { get; private set; }
[Required]
public string Name { get; set; }
...
}
public class Widget
{
public long Id { get; private set; }
[Required]
public string Name { get; set; }
[Required]
public WidgetType WidgetType { get; set; }
...
}
我将它们封装在一个WidgetViewModel
类中,并将其传递给视图,如下所示:
public class WidgetViewModel
{
public Widget Widget { get; set; }
public ICollection<WidgetType> WidgetTypes
{
get
{
return _repository.GetWidgets();
}
}
...
}
我的观点是这样的:
...
@Html.DropDownListFor( m => m.Widget.WidgetType.Id, new SelectList( new EquipmentViewModel().EquipmentTypes, "Id", "Name" ) )
...
除验证外,所有这些都有效。由于CCD_ 3是必需的,所以CCD_。我需要用户选择一个WidgetType
,但我不希望ModelState的验证深度超过"Widget.WidgetType.Id"(这应该是Widget
外键所需的全部内容?(。
有更好的方法吗?我觉得应该有一些方法来验证,而不必递归地深入检查属性,但我找不到。我缺少什么。。。?
public class WidgetViewModel
{
[Required]
public string Name { get; set; }
[Required]
public WidgetType WidgetTypeId { get; set; }
public SelectList WidgetTypes
{
get
{
//This should be popuplated in your controller or factory not in the view model
retun new SelectList{ _repository.GetWidgets(),"Id","Name");
}
}
}
在您看来
@Html.DropDownListFor( m => m.WidgetTypeId, Model.WidgetTypes)
在你的控制器
public ActionResult Create(WidgetViewModel model)
{
Widget widget = new Widget{
Name = model.Name,
WidgetType = yourManager.GetWidgetTypeByID(model.WigetTypeId);
};
yourManager.Create(widget);
//...
}
如果视图中只需要WidgetID,则不需要在WidgetViewModel中包含整个Widget。只需具有名为WidgetID的属性。视图模型类应该只有视图所需的数据。
在提交表单时调用的控制器操作方法中,如果需要,可以使用WidgetID从数据库中获取Widget对象。
http://blog.stevensanderson.com/2010/02/19/partial-validation-in-aspnet-mvc-2/给出了部分验证的示例