2016-11-16 8 views
0

Ich versuche, einen benutzerdefinierten Helfer für EditorFor zu erstellen. Ich möchte die String-Längen von den Modellen nehmen und diese zu den HTML-Attributen hinzufügen.MVC EditorFor Custom Helper

Ich habe bisher Folgendes, aber dies gilt nicht die neuen Attribute, die hinzugefügt werden.

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

'Rückkehr htmlHelper.EditorFor (Ausdruck, ViewData) 'fügt keine Attribute hinzu. Es verwendet nur das ursprüngliche "ViewData" -Attribut, das Sie an die Methode –

+0

übergeben haben. Wie kann ich das bearbeiten und die Attribute zurückgeben? Ich kann das neue viewData-Objekt nicht zurückgeben, da es ein anderer Typ ist – user3208483

Antwort

0

Sie Rückkehr original ViewData Attribut in Methodenparameter anstelle von benutzerdefinierten HTML-Attribute Sammlung auf return htmlHelper.EditorFor(expression, ViewData). Basierend von this answer, sollte Ihre Rückkehr Methode geändert dazu:

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 
} 

Dann benutzerdefinierte HTML-Helfer auf Ansicht Seite wie diese gelten:

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

bearbeiten:

Diese Methode funktioniert auf MVC 5 (5.1) und höher, kann ich nicht sicher sein, dass es in früheren Versionen funktioniert (siehe diese Frage: Html attributes for EditorFor() in ASP.NET MVC).

Für frühere Versionen MVC, Verwendung von HtmlHelper.TextBoxFor mehr bevorzugt wird, welche maxlength Attribut hat sicher:

return htmlHelper.TextBoxFor(expression, htmlAttributes); 

Weitere Referenzen:

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

HTML.EditorFor adding class not working

+0

Die 'EditorFor()' - Methode akzeptiert keine HTML-Attribute in ihrem zweiten Parameter –

Verwandte Themen