2012-12-21 11 views
7

voglio avere personalizzato Html.DateTimePickerFor(a => a.Fields[0].Id, value)Come scrivere personalizzato ASP.NET MVC Helper HTML come Html.TextBoxFor e impostare l'attributo nome corretto

in modo che il risultato dovrebbe essere simile a questo:

<div name="Fields[0].Id"></div> 

Attualmente io uso Html.DatetimePicker("Fields[0].Id", value) e funziona perfettamente, ma voglio generare un nome dinamico.

Quindi la domanda è come impostare l'attributo "name" corretto?

+0

A si tenta di creare una versione 'TextBoxFor' per i campi datetime o un modello' EditFor' per un campo specifico? Penso che questo sia il fattore più importante al momento. –

risposta

4

Prova questo. Per me funziona.

public static MvcHtmlString DateTimePickerFor<TModel, TProp>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProp>> expression, object htmlAttributes) 
    { 
     string name = ExpressionHelper.GetExpressionText(expression); 
     ... rest of code here 
    } 

La magia viene da System.Web.Mvc.ExpressionHelper.GetExpressionText(). Una volta che hai il nome dalla tua espressione, puoi applicarlo al tuo div.

GetExpressionText()

+0

Fai attenzione con questo metodo poiché omette 2 cose che 'NameFor()' ha: 1) attributo di codifica e 2) qualifica di nome. Vedi l'origine MVC, dove il nome è ulteriormente qualificato chiamando: 'html.ViewData.TemplateInfo.GetFullHtmlFieldName (name)' –

+0

Cool! Esattamente quello che volevo. – Sergey

+0

@TimMedora - quale versione di mvc è quella? Lo vedo nella versione attuale del sorgente, ma nell'app MVC3 da cui ho estratto il mio frammento di codice non vedo questo metodo. Solo MVC4? Se hai un'app MVC4, la tua soluzione sembra il modo migliore. – hawkke

2

provare qualcosa di simile (adattato dal codice di lavoro):

public static IHtmlString DateTimePickerFor<TModel, TValue>(
    this HtmlHelper<TModel> helper, 
    Expression<Func<TModel, TValue>> expression, 

    // other input parameters as needed 

) { 
    // metadata gives you access to a variety of useful things, such as the 
    // display name and required status 
    var metadata = ModelMetadata.FromLambdaExpression(expression, helper.ViewData); 
    string markup = ""; // markup for your input    

    var name = helper.NameFor(expression); // getting the name 

    return MvcHtmlString.Create(markup ); 
} 
Problemi correlati