2012-10-06 19 views
13

Sto provando a creare un HtmlHelper che creerà campi di moduli compatibili con Bootstrap. Il mio primo obiettivo era quello di creare un HtmlHelper che creerà il div circostante:Ottenere il nome completo della proprietà usando ModelMetadata

<div class="control-group"> ... </div> 

Seguendo i consigli eccellenti qui e anche qui sono riuscito a farlo funzionare in tempi relativamente brevi. Ma non sempre funziona.

Ho un ViewModel con una proprietà complessa, quindi nel mio modulo accedo al campo m=>m.Complex.Element. Nel mio aiutante, controllo l'elemento per gli errori di convalida. Io uso ModelMetadata.FromLambdaExpression(expression, html.ViewData). I metadati che ottengo hanno il nome della proprietà Element e non Complex.Element.

Quando controllo il ModelState per questa proprietà, non riesco a trovarlo, perché ModelState mantiene il nome completo - Complex.Element.

Posso cercare corrispondenze parziali, sperando che non ci siano altri elementi, ma sembra un brutto baco che aspetta di accadere. Come posso ottenere il nome completo della proprietà dall'espressione?

risposta

27

È una buona cosa che le sorgenti MVC siano fuori all'aperto. Il modo corretto per ottenere il nome della proprietà ModelState è quello di utilizzare

var propertyName = ExpressionHelper.GetExpressionText(expression); 
+1

+1. Ho anche avuto lo stesso problema. La tua risposta mi ha aiutato :) –

6

Ho usato quanto segue per ottenerlo per il modello attuale, potrebbe essere necessario aggiungere il nome della proprietà a questo per ottenerlo per la proprietà.

ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix; 

Altrimenti estrarre riflettore/ilspy/qualunque cosa e verificare che cosa il vostro EditorFor/TextBoxFor o qualsiasi metodo sta rendendo il vostro editor fa.

+0

Ottengo un prefisso vuoto. Analizzerò le origini di MVC 3 e vedremo come Microsoft risolve questo problema. Speravo che qualcun altro lo sapesse e potrebbe salvarmi il tempo. – zmbq

+0

Uso questo (senza "ViewContext.") Nelle mie estensioni HtmlHelper e nel mio editor/modelli di visualizzazione. Funziona fino ad ora – Ingo

+1

quando si scrive la propria estensione helper html è possibile ottenere da lì 'htmlHelper.ViewData.TemplateInfo.HtmlFieldPrefix' – Odys

4

Ho usato una combinazione di entrambe le risposte per un attributo che mi serviva. Insieme, entrambe queste risposte forniscono un attributo di lavoro che posso usare sia in viste che in modelli di editor annidati. Ecco il mio esempio:

public static MvcHtmlString HasErrorClassFor<TModel, TProperty>(
    this HtmlHelper<TModel> htmlHelper, 
    Expression<Func<TModel, TProperty>> expression) 
{ 
    string expressionText = ExpressionHelper.GetExpressionText(expression); 

    string htmlFieldPrefix = htmlHelper.ViewData.TemplateInfo.HtmlFieldPrefix; 

    string fullyQualifiedName; 

    if (htmlFieldPrefix.Length > 0) 
    { 
     fullyQualifiedName = string.Join(".", htmlFieldPrefix, expressionText); 
    } 
    else 
    { 
     fullyQualifiedName = expressionText; 
    } 

    bool isValid = htmlHelper.ViewData.ModelState.IsValidField(fullyQualifiedName); 

    if (!isValid) 
    { 
     return MvcHtmlString.Create("has-error"); 
    } 

    return MvcHtmlString.Empty; 
} 
Problemi correlati