Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在ASP.NET MVC 2.0中对多个属性进行自定义验证?_C#_.net_Asp.net_Asp.net Mvc_Vb.net - Fatal编程技术网

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

C# 如何在ASP.NET MVC 2.0中对多个属性进行自定义验证?,c#,.net,asp.net,asp.net-mvc,vb.net,C#,.net,Asp.net,Asp.net Mvc,Vb.net,基本上,标题是这么说的。我有几个属性,它们结合在一起,形成了一个逻辑答案,我想运行一个服务器端验证代码(我编写的),该代码考虑了这些多个字段,并且只连接到用户在网页上看到的一个验证输出/错误消息 我研究了scott guthries扩展属性并在yoru dataannotations声明中使用它的方法,但是,正如我所见,无法在多个属性上声明dataannotations样式的属性,并且只能将声明(例如[Email]、[Range]、[Required])放在一个属性上:( 关于如何做这件事有什么

基本上,标题是这么说的。我有几个属性,它们结合在一起,形成了一个逻辑答案,我想运行一个服务器端验证代码(我编写的),该代码考虑了这些多个字段,并且只连接到用户在网页上看到的一个验证输出/错误消息

我研究了scott guthries扩展属性并在yoru dataannotations声明中使用它的方法,但是,正如我所见,无法在多个属性上声明dataannotations样式的属性,并且只能将声明(例如[Email]、[Range]、[Required])放在一个属性上:(

关于如何做这件事有什么想法吗?最好不必走整个社交路线?因为我发现这很难理解,主要是因为人们从来没有告诉你他们为什么要做他们正在做的事情,因为他们的细节足够详细,让我觉得舒服


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

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

您可以添加n类的验证属性:


但是,我自己还无法测试这一点。

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

如果操作方法返回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;
  }
if(自定义验证失败…)
{
AddModelError(“Error1”,“您的错误消息1”);
AddModelError(“Error2”,“您的错误消息2”);
}
如果(!ModelState.IsValid)
{
返回新的JsonResult(){Data=GetModelStateErrors(ModelState)};
}
私有静态集合GetModelStateErrors(ModelState ModelState)
{
集合错误=新集合();
foreach(modelState.Values中的var项)
{
foreach(item.Errors中的var item2)
{
如果(!string.IsNullOrEmpty(item2.ErrorMessage))
{
错误。添加(项2.错误消息);
}
}
}
返回错误;
}

我已经这样做了,但现在我不知道如何在我的aspx页面中显示我的错误。我正在尝试执行html.ValidationMessage(“ClassnameWherettributesAdded”)但它不起作用…没有显示错误。由于错误与多个字段相关,因此在一个字段旁边显示错误实际上没有意义。请使用Html.ValidationSummary()命令扩展方法。我使用了验证摘要,就像他们在PasswordsMatch示例中使用它一样,但它没有显示;/opted使用codeplex上提供的FluentValidation,效果很好:)-杀死真实场景中的数据批注。我已经这样做了,但是,即使我按照某些人的建议传递了类名或空字符串,也无法在视图上显示验证消息。谢谢,我还在研究如何通过直接与模型错误集合对话来绕过mvc的固有问题来实现这一点。我将投票:)。