проверка дочерних свойств модели с использованием DataAnnotations или CustomValidation - PullRequest
0 голосов
/ 29 марта 2011

Я работаю над веб-приложением MVC3, и моя Модель состоит из множества классов, которые используют пользовательский тип для текстовых свойств. например, мой объект 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)

есть ли способ включить проверку для этих свойств TextRef с использованием DataAnnotations?

Я не нашел ни одного, поэтому я создал собственный атрибут валидатора:

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-» не сгенерированы для их входных данных.

UPDATE:

мой клиентский скрипт:

$.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 голосов
/ 29 марта 2011

Атрибут выглядит нормально для меня. Вам нужно будет зарегистрировать пользовательский адаптер на стороне клиента, который должен выглядеть примерно так:

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

Который появится выше

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