基本上,标题是什么。我有几个属性组合在一起,真正做出一个逻辑答案,我想运行一个服务器端验证代码(我写),考虑到这些多个字段,并只连接到一个验证输出/错误消息,用户在网页上看到。
我查看了scott guthries扩展属性并在yoru dataannotations声明中使用它的方法,但是,正如我所看到的,没有办法在多个属性上声明dataannotations-style属性,并且您只能放置声明(例如[电子邮件],[范围],[必需])在一个属性上:(。
关于如何解决这个问题的任何想法?最好不必去整个AssociateValidatorProvider路线?因为我发现这很难掌握,因为人们从不告诉你'为什么'他们正在做他们正在做的事情,让我觉得舒服。
目前,我已尝试在表单上创建一个虚拟隐藏字段,其上包含[Required]属性,当我的多字段自定义验证代码预测出错误时,我将其设置为空字符串shoudl触发错误消息,但是甚至不起作用,因为当我在收到操作后更改这些字段的值时,模型状态不会使用此信息更新,因此假设提交的值,并且执行UpdateModel失败并显示错误。除了这些错误之外,我认为这不是优雅的做事方式。所以我正在听你们建议的任何事情。
答案 0 :(得分:2)
答案 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以获取如何执行此操作的简单示例。