【问题标题】:validating child properties of model using DataAnnotations or CustomValidation使用 DataAnnotations 或 CustomValidation 验证模型的子属性
【发布时间】:2011-03-29 12:43:36
【问题描述】:

我正在开发一个 MVC3 网络应用程序,我的模型由许多类组成,这些类对文本属性使用自定义类型。 例如我的产品实体看起来像:

public class Product
{
   public int ProductId {get;set;}
   public TextRef Title {get;set;}
   public TextRef Description {get;set;}
}

和 TextRef 是:

public class TextRef
{
   public int LangId {get;set;}
   public string Text {get;set;}
}

所以在我看来我正在使用:

@Html.EditorFor(model => model.Title.Text)
@Html.ValidationMessageFor(model => model.Title.Text)

有没有办法使用 DataAnnotations 对这些 TextRef 属性进行验证?

我没有找到任何东西,所以我创建了一个自定义验证器属性:

public class TextRefRequiredAttribute : ValidationAttribute, IClientValidatable
{
    public override bool IsValid(object value)
    {
        if (value is TextRef)
            return !string.IsNullOrEmpty(((TextRef)value).Text);
        else
            return true;
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var rule = new ModelClientValidationRule();
        rule.ValidationType = "textref";
        yield return rule;
    }
}

现在服务器端验证正在工作,但客户端却没有。事实上,“data-val-”属性并没有为其输入生成。

更新:

我的客户端脚本是:

$.validator.addMethod("textref", function (value, element, param) {
    return (value != "");
});

$.validator.unobtrusive.adapters.addBool("textref");

我也尝试过使用 FluentValidation:

public class CategoryValidator : AbstractValidator<CategoryViewModel>
{
    public CategoryValidator()
    {
        RuleFor(o => o.Title.Text)
            .NotEmpty();
    }
}

但仍然没有机会。

谢谢

【问题讨论】:

    标签: asp.net-mvc validation asp.net-mvc-3 customvalidator


    【解决方案1】:

    我觉得这个属性没问题。您需要在客户端注册自定义适配器,但看起来应该有点像这样。

    <script type="text/javascript">
        $(function () {
            jQuery.validator.unobtrusive.adapters.addBool('textref');
        });
    </script>
    

    上面会出现的

    @Html.EditorFor(model => model.Title.Text)
    @Html.ValidationMessageFor(model => model.Title.Text)
    

    【讨论】:

    • 谢谢,实际上我首先注册了适配器。我发现如果我将 EditorFor(model=> model.Title.Text) 更改为 TextBoxFor(model=>o.model.Title),“data-val-”属性将被添加到输入元素和客户端验证对,但这样做会导致绑定问题,并且接收 model.Title 将为 null
    • 您是否设法弄清楚如何解决这个问题?我面临着完全相同的问题,但是对于 DateTime 类型,我无法自己装饰 Date 和 TimeOfDay 属性。
    猜你喜欢
    • 2012-02-17
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    相关资源
    最近更新 更多