2

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

我有一个简单的项目类:

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 表单值(字符串数组)与应该是 Category 类型相关联,但不能(我收到错误“The parameter conversion from type 'System.String ' 键入失败,因为没有类型转换器可以在这些类型之间转换")。因此,我必须将表单名称更改为 m.Categories 之类的名称,从而与 Product 类分离,因此我想用任何验证逻辑来​​装饰它。

哇,对我来说这太疯狂了。我们不能使用 MVC2 装饰器验证一个简单的多选列表吗?

4

1 回答 1

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

于 2010-03-03T15:47:32.543 回答