2009-08-05 11 views
11

Po dodaniu przez MVC 2 edytora HtmlHelper EditorFor() nie jest możliwe tworzenie silnie typowanych szablonów wyświetlania i edytowania dla danego obiektu modelu i po nim manipulowanie. Jestem nieco zaskoczony, jak przekazać dodatkowe dane modelu do edytora, nie tracąc przy tym silnego pisania kontrolki edytora.ASP.NET MVC 2 - HTML.EditorFor() i Custom EditorTemplates

Klasyczny Przykład: produkt ma kategorię. ProductEditor ma DropDownList dla kategorii zawierający nazwy wszystkich kategorii. ProductEditor jest ściśle wpisany w Product i musimy przekazać SelectList of Categories oraz Product.

W standardowym widoku zawijamy dane modelu do nowego typu i przekazujemy je dalej. Z EditorTemplate tracimy niektóre standardowe funkcje, jeśli przekazujemy mieszany model zawierający więcej niż jeden obiekt (najpierw zauważyłem, że wszystkie metody LabelFor/TextBoxFor wytwarzały nazwy jednostek, takie jak "Model.Object", a nie tylko "Object" ").

Czy robię to źle, czy Html.EditorFor() powinien mieć dodatkowy parametr ViewDataDictionary/Model?

Odpowiedz

13

Można utworzyć niestandardowy ViewModel, który ma zarówno właściwości lub będziesz musiał użyć ViewData przekazać te informacje.

+2

Oczywiście ma to sens, ale nie mogłem nie zauważyć, że umieszczenie modelu w zwyczaju ViewModel powoduje nazwy pól formularza być poprzedzony nazwą właściwości obiektu w zwyczaju ViewModel. Nie oznacza to, że jest to problem, ale dodaje kolejny krok do aktualizacji modelu. Prawdopodobnie płaczę niepotrzebnie, co? –

5

jestem w trakcie nauki, ale miałem podobny problem, dla którego ja wypracowaliśmy rozwiązanie. Moja kategoria to wyliczenie i używam formantu szablonu, który analizuje wyliczenie w celu określenia zawartości znacznika Select.

Jest on stosowany w widoku jak:

<%= Html.DropDownList 
      (
      "CategoryCode", 
      MvcApplication1.Utility.EditorTemplates.SelectListForEnum(typeof(WebSite.ViewData.Episode.Procedure.Category), selectedItem) 
      ) %> 

wyliczenia dla kategorii zdobią Opis atrybuty mają być używane jako wartości tekstowe w Wybieranie pozycji:

public enum Category 
     { 
      [Description("Operative")] 
      Operative=1, 
      [Description("Non Operative")] 
      NonOperative=2, 
      [Description("Therapeutic")] 
      Therapeutic=3 
     } 
     private Category _CategoryCode; 
     public Category CategoryCode 
     { 
      get { return _CategoryCode; } 
      set { _CategoryCode = value; } 
     } 

konstruktów SelectListForEnum listę wybranych elementów za pomocą definicji wyliczeniowej i indeksu dla aktualnie wybranego elementu, jak poniżej:

 public static SelectListItem[] SelectListForEnum(System.Type typeOfEnum, int selectedItem) 
    { 
     var enumValues = typeOfEnum.GetEnumValues(); 
     var enumNames = typeOfEnum.GetEnumNames(); 
     var count = enumNames.Length; 
     var enumDescriptions = new string[count]; 
     int i = 0; 
     foreach (var item in enumValues) 
     { 
      var name = enumNames[i].Trim(); 
      var fieldInfo = item.GetType().GetField(name); 
      var attributes = (DescriptionAttribute[])fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false); 
      enumDescriptions[i] = (attributes.Length > 0) ? attributes[0].Description : name; 
      i++; 
     } 
     var list = new SelectListItem[count]; 
     for (int index = 0; index < list.Length; index++) 
     { 
      list[index] = new SelectListItem { Value = enumNames[index], Text = enumDescriptions[index], Selected = (index == (selectedItem - 1)) }; 
     } 
     return list; 
    } 

Efektem końcowym jest ładnie przedstawiony DDL.

Mam nadzieję, że to pomoże. Wszelkie komentarze na temat lepszych sposobów zrobienia tego będą bardzo mile widziane.

Powiązane problemy