如何在ASP.NET MVC 2.0中对多个属性进行自定义验证?

时间:2010-05-06 13:38:32

标签: c# .net asp.net asp.net-mvc vb.net

基本上,标题是什么。我有几个属性组合在一起,真正做出一个逻辑答案,我想运行一个服务器端验证代码(我写),考虑到这些多个字段,并只连接到一个验证输出/错误消息,用户在网页上看到。

我查看了scott guthries扩展属性并在yoru dataannotations声明中使用它的方法,但是,正如我所看到的,没有办法在多个属性上声明dataannotations-style属性,并且您只能放置声明(例如[电子邮件],[范围],[必需])在一个属性上:(。

关于如何解决这个问题的任何想法?最好不必去整个AssociateValidatorProvider路线?因为我发现这很难掌握,因为人们从不告诉你'为什么'他们正在做他们正在做的事情,让我觉得舒服。

目前,我已尝试在表单上创建一个虚拟隐藏字段,其上包含[Required]属性,当我的多字段自定义验证代码预测出错误时,我将其设置为空字符串shoudl触发错误消息,但是甚至不起作用,因为当我在收到操作后更改这些字段的值时,模型状态不会使用此信息更新,因此假设提交的值,并且执行UpdateModel失败并显示错误。除了这些错误之外,我认为这不是优雅的做事方式。所以我正在听你们建议的任何事情。

3 个答案:

答案 0 :(得分:2)

您可以向班级添加验证属性:

http://msdn.microsoft.com/en-us/magazine/ee336030.aspx

但是我自己无法对此进行测试。

答案 1 :(得分:2)

您可以将这些验证消息添加到ModelState错误中,并使用Jquery / JavaScript在客户端显示它们。

如果您的action方法返回JsonResult,则返回错误,因为JsonResult将错误设置为ViewData,然后在客户端访问并显示它们。

您可以将自定义错误添加到模型状态,如下所示:

 if(your custom validation fails....)
 {
     ModelState.AddModelError("Error1", "Your Error message1");
     ModelState.AddModelError("Error2", "Your Error message2");
 }

 if (!ModelState.IsValid)
 {
     return new JsonResult() { Data = GetModelStateErrors(ModelState)};
 }

 private static Collection<string> GetModelStateErrors(ModelState modelState)
  {
       Collection<string> errors = new Collection<string>();

       foreach (var item in modelState.Values)
       {
            foreach (var item2 in item.Errors)
            {
                if (!string.IsNullOrEmpty(item2.ErrorMessage))
                {
                    errors.Add(item2.ErrorMessage);

                }
            }
       }
       return errors;
  }

答案 2 :(得分:0)

您需要创建一个类级别属性。在visual studio中,创建一个新的MVC 2项目,然后搜索PropertiesMustMatchAttribute以获取如何执行此操作的简单示例。