Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.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
Asp.net mvc 哪个MVC验证框架_Asp.net Mvc_Validation_Exception_Xval - Fatal编程技术网

Asp.net mvc 哪个MVC验证框架

Asp.net mvc 哪个MVC验证框架,asp.net-mvc,validation,exception,xval,Asp.net Mvc,Validation,Exception,Xval,我一直在评估xVal作为ASP.NETMVC框架中验证实体的框架。我最近发现,每次验证规则被破坏时,xVal都会导致抛出一个expetion。对我来说,这似乎是不正确的。例如,当用户填写表单时,忘记填写三个必填字段,将抛出三个异常。这是好的做法吗?(编辑:所以我想这不是一个好的做法) 您使用xVal的经验是什么?有没有不抛出异常的好的替代验证框架 谢谢 (注:我注意到很多人都在读这篇文章,只是想让你现在知道)不,显示异常而不是一些简单的消息不是一个好的做法,因为没有什么严重的问题。。。您应该使用

我一直在评估xVal作为ASP.NETMVC框架中验证实体的框架。我最近发现,每次验证规则被破坏时,xVal都会导致抛出一个expetion。对我来说,这似乎是不正确的。例如,当用户填写表单时,忘记填写三个必填字段,将抛出三个异常。这是好的做法吗?(编辑:所以我想这不是一个好的做法)

您使用xVal的经验是什么?有没有不抛出异常的好的替代验证框架

谢谢


(注:我注意到很多人都在读这篇文章,只是想让你现在知道)

不,显示异常而不是一些简单的消息不是一个好的做法,因为没有什么严重的问题。。。您应该使用这些错误填充
ModelState
,并使用

Html.ValidationMessage("EntityPropertyName");
xVal支持所有这些。以及在表单发回之前在客户端进行验证

一些代码 当您为实体类(或其元数据伴生类)设置
DataAnnotations
属性时,您很可能还实现了Validate()方法。最好的方法是使用T4自动生成这些代码,这样你就不必一遍又一遍地重复相同的代码

public IEnumerable<ErrorInfo> Validate()
{
    IList<ErrorInfo> errors = DataAnnotationsValidationRunner.GetErrors(this).ToList<ErrorInfo>();
    return errors.AsEnumerable();
}
MVC2
Asp.net MVC 2 Beta 2中的验证类似于xVal所做的。所以,如果你对项目不太感兴趣,你可以考虑在开发过程中使用代码作为你的基础,也许这就是你的方法。

你查看了beta 2中的验证吗?


我认为xVal很棒,我一直在使用它,它工作得非常完美。只要在运行验证时捕获RulesException,并将错误添加到ModelState,例如

try
{
  // execute validation runner
}
catch (RulesException ex)
{
   ex.AddModelStateErrors(ModelState, "prefix");
}

ASP.NET MVC v2将推出自己的版本。

感谢您的提示。一个很好的答案,但是没有真正的示例代码。我已经为您做了标记,但我不知道MVC 2 Beta中的新功能。MVC2功能与xVal非常相似,因此仍有一些部分需要您自己完成,以使其尽可能自动化并避免代码重复。不,我没有,但快速查看后,我认为这将非常有用。很遗憾,与Castle validator和xVal相比,它缺少一些功能。例如,[ValidateSameAs]。是的,您可以编写自定义验证属性,但它必须应用于模型类而不是属性。所以它只向ValidationSummery显示错误消息。对于遇到此问题的人,请查看scott gu和Castle validators&xVal rocks的帖子。
public static class DataAnnotationsValidationRunner
{
    public static IEnumerable<ErrorInfo> GetErrors(object instance)
    {
        var metadataAttribute = instance.GetType().GetCustomAttributes(typeof(MetadataTypeAttribute), true).OfType<MetadataTypeAttribute>().FirstOrDefault();
        var metaClass = metadataAttribute != null ? metadataAttribute.MetadataClassType : instance.GetType();
        var metaClassProperties = TypeDescriptor.GetProperties(metaClass).Cast<PropertyDescriptor>();
        var modelClassProperties = TypeDescriptor.GetProperties(instance.GetType()).Cast<PropertyDescriptor>();

        return from metaProp in metaClassProperties
               join modelProp in modelClassProperties on metaProp.Name equals modelProp.Name
               from attribute in metaProp.Attributes.OfType<ValidationAttribute>()
               where !attribute.IsValid(modelProp.GetValue(instance))
               select new ErrorInfo(metaProp.Name, attribute.FormatErrorMessage(string.Empty), instance);
    }
}
try
{
  // execute validation runner
}
catch (RulesException ex)
{
   ex.AddModelStateErrors(ModelState, "prefix");
}