Я разработал свой собственный 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()
);
}
Вы должны знать, что моя аннотация данных CustomRequired работает для базового помощника, такого как @ Html.RadioButtonFor (model => model.ADR), но не работает при использовании в пользовательских htmlhelpers.
Я знаю, что когда я использую в моей модели «классическую» аннотацию данных, такую как [Обязательный], у меня нет проблем с получением атрибутов проверки, НО при использовании атрибута CustomRequiredAttribute GetUnobtrusiveValidationAttributes ничего не возвращает!
Есть идеи почему?Если мне не ясно, не стесняйтесь просить меня уточнить.
Я забыл сказать, что я использую Entity Framework Code First с MVC3.
Спасибо.