2016-11-16 7 views
0

Я пытаюсь создать собственный помощник для редактора. Я хочу взять длину строк из моделей и добавить это в атрибуты html.MVC EditorFor Custom Helper

У меня есть следующее до сих пор, но это не применяет новые добавленные атрибуты.

public static IHtmlString MyEditorFor<TModel, TValue>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TValue>> expression, object ViewData, bool disabled = false, bool visible = true) 
    { 
     var member = expression.Body as MemberExpression; 
     var stringLength = member.Member.GetCustomAttributes(typeof(StringLengthAttribute), false).FirstOrDefault() as StringLengthAttribute; 

     RouteValueDictionary viewData = HtmlHelper.AnonymousObjectToHtmlAttributes(ViewData); 
     RouteValueDictionary htmlAttributes = HtmlHelper.AnonymousObjectToHtmlAttributes(viewData["htmlAttributes"]); 

     if (stringLength != null) 
     { 
      htmlAttributes.Add("maxlength", stringLength.MaximumLength); 
     } 

     return htmlHelper.EditorFor(expression, ViewData); 
    } 
+0

'возвращение htmlHelper.EditorFor (выражение, ViewData) 'не добавляет никаких атрибутов. Его просто использует оригинальный атрибут «ViewData», который вы передали методу –

+0

Как его изменить и вернуть атрибуты? Я не могу вернуть новый объект viewData, поскольку он является другим типом. – user3208483

ответ

0

Вы возвращаетесь оригинальный ViewData атрибут в параметре методы вместо пользовательских HTML атрибуты коллекции на return htmlHelper.EditorFor(expression, ViewData). Исходя из this answer, ваш метод возвращения должен изменен следующим образом:

public static IHtmlString MyEditorFor<TModel, TValue>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TValue>> expression, object ViewData, bool disabled = false, bool visible = true) 
{ 
    var member = expression.Body as MemberExpression; 
    var stringLength = member.Member.GetCustomAttributes(typeof(StringLengthAttribute), false).FirstOrDefault() as StringLengthAttribute; 

    RouteValueDictionary viewData = HtmlHelper.AnonymousObjectToHtmlAttributes(ViewData); 
    RouteValueDictionary htmlAttributes = HtmlHelper.AnonymousObjectToHtmlAttributes(viewData["htmlAttributes"]); 

    if (stringLength != null) 
    { 
     htmlAttributes.Add("maxlength", stringLength.MaximumLength); 
    } 

    return htmlHelper.EditorFor(expression, htmlAttributes); // use custom HTML attributes here 
} 

Затем примените пользовательский HTML помощник на вид сбоку, как это:

@Html.MyEditorFor(model => model.Property, new { htmlAttributes = new { @maxlength = "10" }}) 

Edit:

Этот метод работает на MVC 5 (5.1) и выше, я не уверен, что он работает в более ранних версиях (см. Этот вопрос: Html attributes for EditorFor() in ASP.NET MVC).

Для более ранних версий MVC, использование HtmlHelper.TextBoxFor является более предпочтительным, что, безусловно, имеет maxlength атрибут:

return htmlHelper.TextBoxFor(expression, htmlAttributes); 

Дополнительные ссылки:

Set the class attribute to Html.EditorFor in ASP.NET MVC Razor View

HTML.EditorFor adding class not working

+0

Метод 'EditorFor()' не принимает атрибуты html во втором параметре –