валидиране на дъщерни свойства на модел с помощта на DataAnnotations или CustomValidation

работя върху MVC3 webapp и моят модел се състои от много класове, които използват персонализиран тип за текстови свойства. например моят продуктов обект изглежда така:

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-" не са генерирани за техните входове.

АКТУАЛИЗАЦИЯ:

клиентският ми скрипт е:

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

но пак няма шанс.

Благодаря


person Alireza Sabouri    schedule 29.03.2011    source източник


Отговори (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)
person AndyM    schedule 29.03.2011
comment
Благодаря, всъщност регистрирах адаптера на първо място. установявам, че ако променя EditorFor(model=› model.Title.Text) на TextBoxFor(model=›o.model.Title), атрибутите data-val ще бъдат добавени към входните елементи и валидирането от страна на клиента върви правилно, но това ще доведе до проблеми със свързването и получаващия модел. Заглавието ще бъде нула - person Alireza Sabouri; 29.03.2011
comment
Успяхте ли да разберете как да разрешите това? Изправен съм пред абсолютно същия проблем, но с типа DateTime, където не мога сам да декорирам свойствата Date и TimeOfDay. - person Jeow Li Huan; 01.05.2012