Невозможно получить атрибуты проверки (из моей модели) в моем настраиваемом помощнике по HTML - PullRequest
3 голосов
/ 06 марта 2012

Я разработал свой собственный htmlhelper для управления переключателями.Нет проблем для генерации основного HTML-тега из моего пользовательского помощникаНо у меня есть проблемы с внедрением атрибутов проверки в мой HTML-тег (ненавязчивая проверка на стороне клиента).Я использовал htmlHelper.GetUnobtrusiveValidationAttributes (префикс) для извлечения атрибутов проверки из моей модели (аннотации данных), но он не работает для моего пользовательского RequiredAttribute.

Вот часть модели моего вида:

public class MaterialEditNewViewModel
{
    public int RequestId { get; set; }

    [CustomRequired]
    Public bool ADR { get; set; }
    ...
}

Вот мой CustomRequired:

public class CustomRequiredAttribute : RequiredAttribute
{        
    public override string FormatErrorMessage(string name)
    {
        string translatedFieldName = UserResource.ResourceManager.GetString(name);
        if (string.IsNullOrWhiteSpace(translatedFieldName))
            translatedFieldName = name;
        return string.Format(UserResource.FieldRequired, translatedFieldName);
    }   
}

Вот мой пользовательский помощник html:

public static IHtmlString RadioButtonFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object value, string labelText)
    {
        var metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
        string prefix = ExpressionHelper.GetExpressionText(expression);

        var validationAttributes = htmlHelper.GetUnobtrusiveValidationAttributes(prefix); 

        object currentValue = metadata.Model;
        string property = metadata.PropertyName;

        // Build the radio button html tag 
        var htmlRadio = new TagBuilder("input");
        htmlRadio.GenerateId(property + value);
        htmlRadio.Attributes["type"] = "radio";
        htmlRadio.Attributes["name"] = property;
        htmlRadio.Attributes["value"] = Convert.ToString(value);

        foreach (KeyValuePair<string, object> pair in validationAttributes)
        {
            htmlRadio.MergeAttribute(pair.Key, pair.Value.ToString());
        } 

        if (object.Equals(currentValue, value))
        {
            htmlRadio.Attributes["checked"] = "checked";
        }

        // Build the label html tag 
        var label = new TagBuilder("label");
        label.Attributes["for"] = htmlRadio.Attributes["id"];
        label.SetInnerText(labelText);

        // Return the concatenation of both tags 
        return new HtmlString(htmlRadio.ToString(TagRenderMode.SelfClosing) + label.ToString()
        );
    }
  1. Вы должны знать, что моя аннотация данных CustomRequired работает для базового помощника, такого как @ Html.RadioButtonFor (model => model.ADR), но не работает при использовании в пользовательских htmlhelpers.

  2. Я знаю, что когда я использую в моей модели «классическую» аннотацию данных, такую ​​как [Обязательный], у меня нет проблем с получением атрибутов проверки, НО при использовании атрибута CustomRequiredAttribute GetUnobtrusiveValidationAttributes ничего не возвращает!

Есть идеи почему?Если мне не ясно, не стесняйтесь просить меня уточнить.

Я забыл сказать, что я использую Entity Framework Code First с MVC3.

Спасибо.

1 Ответ

0 голосов
/ 06 марта 2012

Поскольку RequiredAttribute не реализует интерфейс IClientValidatable , необходимо зарегистрировать пользовательский адаптер для своего пользовательского атрибута.Вы можете сделать это, добавив следующую строку в Application_Start:

DataAnnotationsModelValidatorProvider.RegisterAdapter(
    typeof(CustomRequiredAttribute), 
    typeof(RequiredAttributeAdapter)
);

Существует 2 способа реализации атрибутов проверки на стороне клиента:

  • Ваш настраиваемый атрибут проверки реализуетIClientValidatable интерфейс
  • Зарегистрировать пользовательский адаптер

RequiredAttribute использует второй подход.Он связывает RequiredAttributeAdapter со всеми необходимыми атрибутами.Но поскольку вы унаследовали атрибут RequiredAttribute, у вашего пользовательского атрибута больше нет адаптера.Поэтому вам нужно зарегистрировать его в Application_Start.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...