这似乎是一个非常基本的场景,但我认为它没有一个圆满的结局。
我有一个简单的项目类:
public class Project
{
[Required(ErrorMessage = "Project title is required")]
[DisplayName("Project Title")]
public string Title { get; set; }
[DisplayName("Related Categories")]
public Category Categories { get; set; }
}
我想确保至少选择了一个相关的类别。如何在视图中使用Html.EnableClientValidation()和模型中的装饰器对此进行验证?如果这不可能,后退是什么?
同样令人沮丧,可能是验证的障碍是我做不到......
<%= Html.ListBoxFor(m => m.Project.Categories,
new SelectList(Model.Categories, "Id", "Name"))%>
...因为这将尝试将Project.Categories表单值(字符串数组)与应该是类别类型相关联,但是不能(我收到错误“参数从类型转换” System.String'输入失败,因为没有类型转换器可以在这些类型之间进行转换“)。因此,我必须将表单名称更改为m.Categories,从而取消与Product类的关联,因此我想用它来装饰任何验证逻辑。
哇,对我来说这太疯狂了。我们无法使用MVC2装饰器验证简单的多选列表吗?答案 0 :(得分:1)
我将尝试回答,因为这就是我现在正在做的事情:
在我的视图模型中,我说:
[Required(ErrorMessage = "A category is required")]
public IEnumerable<Category> Categories { get; set; }
验证将在UI中进行。但是,模型状态仍然没有在动作中显示为无效...因为绑定命名不完全匹配,所以这种方法当然不是很稳固,但我认为可以解决
此外,这引出了一个有趣的观点,即可能使用1:1 Action:ViewModel关系。通过这样做,您可以在视图模型中设置视图特定验证。这与依赖验证实体不同,验证实体将是更广泛的模型验证的一部分,这是MVC 2最终版本的发展方向。
相关:
MVC 2 RC 2中的模型验证:http://bradwilson.typepad.com/blog/2010/01/input-validation-vs-model-validation-in-aspnet-mvc.html
1:1查看模型:行动方法:http://www.lostechies.com/blogs/jimmy_bogard/archive/2009/06/29/how-we-do-mvc-view-models.aspx