Атрибут MVC Custom Model для атрибута HTML - PullRequest
1 голос
/ 23 ноября 2011

В настоящее время я неправильно использую (насколько мне известно) атрибут ValidateAttribute для отображения атрибута модели при создании представления HTML.

У меня есть свойство модели с настраиваемым атрибутом (включающим некоторую обработку Json на стороне клиента):

[JsonResultPair("Zipcode","City")]
public virtual string City { get; set; }

Который используется в представлении следующим образом:

@Html.TextBoxFor(m => m.City, new { @class = "A", tabindex = 10, title = "B" })

Что приводит к:

<input class="A" data-val="true" data-val-pair="" data-val-pair-fld="City" data-val-pair-src="Zipcode" id="City" name="City" tabindex="10" title="B" type="text" value=""/>

Но в идеале я хочу пропустить атрибут data-val-pair = "", обычно используемый для хранения сообщений об ошибках, потому что это не фактическая проверка. И я хотел бы использовать data-value (или любое другое имя после data-) вместо data-val. Есть идеи как это сделать?

Моя текущая реализация атрибута:

[AttributeUsage(AttributeTargets.Property)]
public class JsonResultPair: ValidationAttribute
{
    private readonly String _source;
    private readonly String _field;

    public JsonResultPair(String source, String field)
    {
        _source = source;
        _field = field;
    }

    public String Source { get { return _source; } }
    public String Field { get { return _field; } }
}

Моя текущая реализация адаптера:

// thanks: /2667748/kak-poluchit-polzovatelskii-atribut-validationattribute-otobrazhaemyi-kak-atribut-data-val-xx-na-storone-klienta
public class JsonResultPairAdapter : DataAnnotationsModelValidator<JsonResultPair>
{
    private const String Pair = "pair";
    private const String PairSource = "src";
    private const String PairField = "fld";

    public JsonResultPairAdapter(ModelMetadata metadata, ControllerContext context, JsonResultPair attribute) : base(metadata, context, attribute)
    {
    }

    public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
    {
        ModelClientValidationRule rule = new ModelClientValidationRule
        {
            ErrorMessage = ErrorMessage,
            ValidationType = Pair
        };

        rule.ValidationParameters.Add(PairSource, Attribute.Source);
        rule.ValidationParameters.Add(PairField, Attribute.Field);

        return new []{ rule};
    }
}

1 Ответ

1 голос
/ 14 мая 2012

Я думаю, что этот блог содержит очень хороший / подробный ответ на ваш вопрос: добавить атрибуты html

Основные шаги:

  1. создайте пользовательский атрибут (который вы уже сделали), не наследуйте от атрибутов проверки
  2. создать поставщика метаданных на основе поставщика аннотаций данных, который также будет считывать / добавлять ваши атрибуты в метаданные модели
  3. создайте шаблон для текстового поля или в самом представлении запросите Model.Metadata, чтобы получить настраиваемый атрибут и его значение, которое вы используете.
...