2011-11-18 6 views
27

Ho un'enumerazione nel mio progetto e ho creato un modello di editor personalizzato per questa enumerazione. Quindi, ora qualsiasi modello che ho con una proprietà con un tipo di questa enumerazione, renderà un menu a discesa.Come posso ottenere il nome della proprietà nel mio modello di editor personalizzato MVC3

Questo funziona benissimo, ma vorrei nominare il mio elemento select del mio menu a discesa con il nome della proprietà. Ecco il mio codice Razor per il mio modello di editor.

@model ItemEnumerations.ItemType 

    <select id="PropertyNameHere" name="PropertyNameHere"> 
    @foreach (ItemEnumerations.ItemType in Enum.GetValues(typeof(ItemEnumerations.ItemType))) { 
     <option value="@value" @(Model == @value ? "selected=\"selected\"" : "")>@value.ToString()</option>   
    } 
    </select> 

Allora, dove ho 'PropertyNameHere' per gli elementi di selezione attributi id e nome, vorrei avere il nome della proprietà del mio modello. Ecco un esempio:

il mio modello:

public class MyModel{ 
     public int ItemID {get;set;} 
     public string ItemName {get;set;} 
     public ItemEnumerations.ItemType MyItemType {get;set;} 
    } 

mio Visualizza codice:

@model MyModel 

@Html.LabelFor(m => model.ItemID) 
@Html.DisplayForm(m => model.ItemID) 

@Html.LabelFor(m => model.ItemName) 
@Html.EditorFor(m => model.ItemName) 

@Html.LabelFor(m => model.MyItemType) 
@Html.EditorFor(m => model.MyItemType) 

Vorrei che il mio elemento di selezione per avere un nome e l'ID del 'MyItemType'.

+0

Forse una soluzione migliore sarebbe quella di estendere il metodo DropDownFor per gestire il mio conteggio? –

+0

Prova questo ...http://blog.nathan-taylor.net/2012/10/aspnet-mvc-get-field-name-and-id-for.html –

risposta

51

ho trovato la risposta in un libro che ho qui. In realtà, mi ha fatto chiudere, ma ho poi potuto google il resto in base a quello che ho trovato.

Ecco cosa dovevo aggiungere al mio modello di editor.

@{var fieldName = ViewData.TemplateInfo.HtmlFieldPrefix;} 
<select id="@fieldName" name="@fieldName"> 
+2

Jeff, dopo questo ho trovato il metodo GetFullHtmlFieldName() ... ViewData.TemplateInfo.GetFullHtmlFieldName ("campo") – Gadonski

+3

Se si utilizza il modello predefinito per l'editor, è possibile anche ottenere il nome tramite 'ViewData.ModelMetadata .PropertyName'. Tuttavia, utilizzando la soluzione che hai proposto funziona utilizzando il modello predefinito o specificando un nome modello (ad esempio '@ Html.EditorFor (m => m.ItemName," templatename ")'). –

-1

È possibile creare un aiutante da usare che all'interno della vostra vista, che è spiegato here

Ed è possibile utilizzare questo pezzo di codice per ottenere il nome.

public static class GenericHelper<T> 
{ 
    public static String GetPropertyName<TValue>(Expression<Func<T, TValue>> propertyId) 
    { 
     var operant = (MemberExpression)((UnaryExpression)propertyId.Body).Operand; 
     return operant.Member.Name; 
    } 
} 

Suppongo che l'aiutanti di default fare lo stesso, come ad esempio HiddenFor, come usano anche Expression<Func<TModel, TProperty>>

+0

Speravo di ottenere il nome della proprietà tramite alcuni metadati. Mi piacerebbe renderlo il più generico possibile. –

+0

L'utilizzo di Expression <> lo mantiene generico vero? Nella tua vista useresti @ Http.YourHelper (m => model.ItemID) dove l'helper restituisce GetPropertyName dallo snippet di codice –

+0

vedi il mio commento a @Todd, si applica anche qui. – chiccodoro

4

Come circa la seguente configurazione:

@model ItemEnumerations.ItemType 
@{ 
    var values = 
     from value in Enum.GetValues(typeof(ItemType)).Cast<ItemType>() 
     select new { ID = (int)value, Name = value.ToString() }; 
    var list = new SelectList(values , "ID", "Name", (int)Model); 
} 
@Html.DropDownList("", list) 

In questo modo non è necessario per rendere manualmente <select> e <option> tag e si sta riutilizzando l'esistente DropDownList aiutante.

+0

Questo ha funzionato con il mio codice (vedi la mia risposta a questa domanda), ma lo sto abbandonando per la soluzione. Mi piace usare l'helper esistente. Ancora una volta, grazie Darin. –

19

Per riferimento futuro (vecchia domanda), ho trovato questo: System.Web.Mvc.Html.NameExtensions.

Utilizzando quelli, si può fare qualcosa di simile

<input type=text" name="@Html.NameFor(m => m.MyProperty)"> 

e si otterrà

<input type=text" name="MyProperty"> 

Ci sono molti altri aiutanti relativi a questa classe di estensione. Questo metodo non si limita a ottenere il nome della proprietà, però. Ad esempio, è possibile utilizzare m.MyProperty.MySubProperty e si otterrà un nome HTML valido per la pubblicazione.

+1

Buono a sapersi. Tuttavia, non risponde alla domanda, poiché è ancora necessario conoscere il nome "MyProperty" per poterlo utilizzare. Ma se chiami 'EditorFor (m => m.MyProperty)' e all'interno del modello Editor vuoi scoprire che il nome per cui è stato chiamato è 'MyProperty', questo non aiuta. – chiccodoro

+0

Questo ha risolto il mio problema di ottenere i nomi delle proprietà annidate. – jahu

2

È possibile ottenere il nome della proprietà nel modello di editor di via

@{ 
    string name = ViewData.ModelMetadata.PropertyName; 
} 
Problemi correlati