2011-11-18 15 views
27

Mam wyliczenie w moim projekcie i utworzyłem niestandardowy szablon edytora dla tego wyliczenia. Tak więc każdy model, który mam z właściwością z typem tego wyliczenia, wyświetli menu rozwijane.Jak uzyskać nazwę właściwości w moim niestandardowym szablonie edytora MVC3

Działa to świetnie, ale chciałbym nazwać wybrany element mojego menu rozwijanego nazwą nieruchomości. Oto mój kod Razor dla mojego szablonu edytora.

@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> 

Więc gdzie mam „PropertyNameHere” dla wybranych elementów i nazwy atrybutów id, chciałbym mieć nazwę właściwości mojego modelu. Oto przykład:

My Model:

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

moim zdaniem Kod:

@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) 

Chciałbym mój wybierz element, który ma nazwę i identyfikator 'MyItemType'.

+0

Może lepszym rozwiązaniem byłoby rozszerzenie metody DropDownFor do obsługi mojego wyliczenie? –

+0

Wypróbuj to ...http://blog.nathan-taylor.net/2012/10/aspnet-mvc-get-field-name-and-id-for.html –

Odpowiedz

51

Znalazłem odpowiedź w książce mam tutaj. Właściwie to zbliżyło mnie do siebie, ale mogłem wtedy wypróbować resztę, bazując na tym, co znalazłem.

Oto, co muszę dodać do mojego szablonu edytora.

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

TKS Jeff, po to znalazłem GetFullHtmlFieldName() metoda ... ViewData.TemplateInfo.GetFullHtmlFieldName („pole”) – Gadonski

+3

Jeśli używasz domyślnego szablonu dla edytora, można również uzyskać poprzez nazwę 'ViewData.ModelMetadata .PropertyName'. Jednak użycie rozwiązania zostały zaproponowane prace przy użyciu domyślnego szablonu lub specifiying nazwę szablonu (tj '@ Html.EditorFor (m => m.ItemName„templatename”)'). –

-1

Można utworzyć pomocnika w obsłudze, że wewnątrz widoku, który jest wyjaśnione here

I można wykorzystać ten kawałek kodu, aby uzyskać nazwę.

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; 
    } 
} 

Zakładam domyślne pomocnicy robią to samo, takie jak HiddenFor, jak również korzystać Expression<Func<TModel, TProperty>>

+0

miałem nadzieję uzyskać nazwę właściwości poprzez jakiś metadanych. Chciałbym uczynić to tak ogólnym, jak to tylko możliwe. –

+0

Użycie wyrażenia <> zachowuje ogólne? Państwa zdaniem byłoby użyć @ Http.YourHelper (m => model.ItemID), gdzie pomocnik wraca GetPropertyName z fragmentem kodu –

+0

patrz mój komentarz do @Todd, stosuje się również tutaj. – chiccodoro

4

Jak o następującej formy:

@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) 

W ten sposób nie trzeba ręcznie renderowanie <select> i <option> tagi i jesteś ponowne wykorzystanie istniejącej DropDownList pomocnika.

+0

To działało z moim kodem (zobacz moją odpowiedź na to pytanie), ale porzucam to dla twojego rozwiązania. Lubię korzystać z istniejącego pomocnika. Jeszcze raz, dzięki Darin. –

19

Na przyszłość (stare pytanie) znalazłem: System.Web.Mvc.Html.NameExtensions.

Stosując te można coś zrobić jak

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

a dostaniesz

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

Istnieje kilka innych związanych z pomocników w tej klasie przedłużacza. Ta metoda ma jednak coś więcej niż tylko nazwę właściwości. Na przykład możesz użyć m.MyProperty.MySubProperty i otrzymasz prawidłową nazwę HTML do publikowania.

+1

Dobrze wiedzieć. Nie odpowiada jednak na pytanie, ponieważ nadal musisz znać nazwę 'MyProperty', aby móc z niej korzystać. Ale jeśli nazwiesz 'EditorFor (m => m.MyProperty)' oraz w szablonie edytora, chcesz dowiedzieć się, że nazwa, do której został wywołany była 'MyProperty', to nie pomaga. – chiccodoro

+0

Rozwiązało to mój problem z uzyskiwaniem nazw zagnieżdżonych właściwości. – jahu

2

Można uzyskać nazwę właściwości w szablonie edytora poprzez

@{ 
    string name = ViewData.ModelMetadata.PropertyName; 
} 
Powiązane problemy