使用DataAnnotations或CustomValidation验证模型的子属性

时间:2011-03-29 12:43:37

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

我正在开发一个MVC3 webapp,我的模型包含许多使用自定义类型的文本属性的类。 例如我的Product实体看起来像:

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();
    }
}

但仍然没有机会。

感谢

1 个答案:

答案 0 :(得分:0)

该属性对我来说没问题。您需要在客户端注册自定义适配器,虽然看起来有点像这样。

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

上面会出现

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