如何在MVC2表单中验证多选?

时间:2010-02-24 02:02:41

标签: c# razor asp.net-mvc-2-validation

这似乎是一个非常基本的场景,但我认为它没有一个圆满的结局。

我有一个简单的项目类:

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装饰器验证简单的多选列表吗?

1 个答案:

答案 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