我需要 DataAnnotations v 3.5 的 DataAnnotationsModelBinder

发布于 2024-08-11 04:35:57 字数 206 浏览 5 评论 0原文

我需要一个可与 System.ComponentModel.DataAnnotations v 3.5 配合使用的 DataAnnotationsModelBinder
我在 codeplex 上找到了一个,但适用于 DataAnnotations v 0.99,它不适用于 v 3.5,而且我的 xVal 也不支持无法使用 DataAnnotations v 0.99,所以我有点卡住了

I need a DataAnnotationsModelBinder that is going to work with System.ComponentModel.DataAnnotations v 3.5
i have found one on codeplex, but is for the v 0.99 of DataAnnotations and it doesn't work with v 3.5, and my xVal doesn't work with DataAnnotations v 0.99, so i'm kinda stuck

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

漆黑的白昼 2024-08-18 04:35:57

这是一个相当幼稚的模型绑定器,但它可能正是您正在寻找的。

public class DataAnnotatedModelBinder : IModelBinder
{
    private IModelBinder _defaultBinder = new DefaultModelBinder();


    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    {
        var boundInstance = _defaultBinder.BindModel(controllerContext, bindingContext);

        if (boundInstance != null) {
            PerformValidation(boundInstance, bindingContext);
        }

        return boundInstance;
    }

    protected void PerformValidation(object instance, ModelBindingContext context) 
    {
        var errors = GetErrors(instance);

        if (errors.Any())
        {
            var rulesException = new RulesException(errors);

            rulesException.AddModelStateErrors(context.ModelState, null);
        }
    }

    public static IEnumerable<ErrorInfo> GetErrors(object instance)
    {
        return from prop in TypeDescriptor.GetProperties(instance).Cast<PropertyDescriptor>()
               from attribute in prop.Attributes.OfType<ValidationAttribute>()
               where !attribute.IsValid(prop.GetValue(instance))
               select new ErrorInfo(prop.Name, attribute.FormatErrorMessage(String.Empty), instance);
    }
}

This is a fairly naive model binder, but it might be what you are looking for.

public class DataAnnotatedModelBinder : IModelBinder
{
    private IModelBinder _defaultBinder = new DefaultModelBinder();


    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    {
        var boundInstance = _defaultBinder.BindModel(controllerContext, bindingContext);

        if (boundInstance != null) {
            PerformValidation(boundInstance, bindingContext);
        }

        return boundInstance;
    }

    protected void PerformValidation(object instance, ModelBindingContext context) 
    {
        var errors = GetErrors(instance);

        if (errors.Any())
        {
            var rulesException = new RulesException(errors);

            rulesException.AddModelStateErrors(context.ModelState, null);
        }
    }

    public static IEnumerable<ErrorInfo> GetErrors(object instance)
    {
        return from prop in TypeDescriptor.GetProperties(instance).Cast<PropertyDescriptor>()
               from attribute in prop.Attributes.OfType<ValidationAttribute>()
               where !attribute.IsValid(prop.GetValue(instance))
               select new ErrorInfo(prop.Name, attribute.FormatErrorMessage(String.Empty), instance);
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文