2014-03-05 10 views
6

Ich freue mich auf die Erweiterung "Html.TextBoxFor", um einige spezifische Client-Anforderungen zu erfüllen.MVC5 HTMLHelper-Erweiterung liefert nicht erwarteten Inhalt

Als Plausibilitätsprüfung, begann ich einfach, und gerade eine Test-Erweiterungsmethode, die einfach auf die vorhandene Funktionalität delegieren würde:

public static class HtmlExtensions 
{ 
    public static MvcHtmlString Test<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression) 
    { 
     return htmlHelper.TextBoxFor(expression); 
    } 
} 

Alles schien, bis ich diese gegen ein Modell mit markiert versucht zu arbeiten Anmerkungen, das heißt:

public class TestRoot 
{ 
    [Display(Name = "Max Length 10")] 
    [Required] 
    [StringLength(10)] 
    public string MaxLength10 { get; set; } 
} 

Wenn ich rufe die eingebaute in TextBoxFor Funktion, erhalte ich alle erwarteten mark-up, das heißt:

@ Html.TextBoxFor (e => e.MaxLength10)

<input data-val="true" data-val-length="The field Max Length 10 must be a string with a maximum length of 10." data-val-length-max="10" data-val-required="The Max Length 10 field is required." id="MaxLength10" name="MaxLength10" type="text" value=""> 

Als ich meine Erweiterung genannt, erwartete ich den gleichen Inhalt, sondern bekomme ich dies:

@ Html.Test (e => e.MaxLength10)

<input id="MaxLength10" name="MaxLength10" type="text" value=""> 

Was all die netten Datenaufbelichtung Tags passiert?

Antwort

1

Ich habe eine ähnliche Erweiterungsmethode, die ein Wasserzeichen-Textfeld erstellt, das ordnungsgemäß funktioniert. Versuchen Sie es, um zu sehen, ob es Ihr Problem behebt. Sehen Sie sich auch die ModelMetadata-Instanz an, um festzustellen, ob sie ordnungsgemäß erstellt wird.

public static MvcHtmlString WatermarkTextBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes = null) 
{ 
    ModelMetadata metadata = ModelMetadata.FromLambdaExpression<TModel, TProperty>(expression, htmlHelper.ViewData); 
    string watermark = !String.IsNullOrEmpty(metadata.Watermark) ? metadata.Watermark : metadata.DisplayName; 
    var attributes = htmlHelper.MergeAttributes(htmlAttributes, new { placeholder = watermark }); 

    return htmlHelper.TextBoxFor<TModel, TProperty>(expression, attributes); 
} 
Verwandte Themen