这似乎是一个非常基本的场景,但我认为它没有圆满的结局。
我有一个简单的项目类:
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; }
}
我想确保至少选择了一个相关类别。我如何在 View 中验证这一点,使用 Html.EnableClientValidation() 和模型中的装饰器?如果这不可能,退路是什么?
同样令人沮丧,并且可能阻碍验证的是我不能做...
<%= Html.ListBoxFor(m => m.Project.Categories,
new SelectList(Model.Categories, "Id", "Name"))%>
...因为这将尝试将 Project.Categories 表单值(一个字符串数组)关联到应该是类别类型的内容,但不能(我收到错误“参数转换来自类型” System.String' to type failed because no type converter can convert between these types").因此,我必须将表单名称更改为类似 m.Categories 的名称,从而解除与 Product 类的关联,因此我想用任何验证逻辑来装饰它。
哇,对我来说这太疯狂了。我们无法使用 MVC2 装饰器验证简单的多选列表?
最佳答案
我将尝试给出一个答案,因为这就是我现在正在做的:
在我的 View 模型中,我输入:
[Required(ErrorMessage = "A category is required")]
public IEnumerable<Category> Categories { get; set; }
验证将在 UI 中进行。但是,modelstate 仍然没有在操作中显示为无效...因为绑定(bind)命名不完全匹配,所以这种方法当然不是很可靠,但我认为可以解决.
此外,这引出了一个有趣的观点,即可能使用 1:1 的 Action:ViewModel 关系。通过这样做,您可以在 View 模型中设置特定于 View 的验证。这与依赖验证实体不同,验证实体是更广泛的模型验证的一部分,这是 MVC 2 最终版本的方向。
相关性:
MVC 2 RC 2 中的模型验证:http://bradwilson.typepad.com/blog/2010/01/input-validation-vs-model-validation-in-aspnet-mvc.html
1:1 查看模型: Action 方法:http://www.lostechies.com/blogs/jimmy_bogard/archive/2009/06/29/how-we-do-mvc-view-models.aspx
关于c# - 如何验证 MVC2 表单中的多选?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2323167/