2009-08-05 15 views
11

Mit MVC 2 die Zugabe von der HtmlHelper EditorFor() ist es nicht möglich, stark typisierte Display-und Editor-Vorlagen für ein bestimmtes Modell-Objekt und nachdem ich damit fummeln I Ich bin ein bisschen ratlos, wie man zusätzliche Model-Daten an den Editor weitergibt, ohne die starke Eingabe der Editor-Kontrolle zu verlieren.ASP.NET MVC 2 - HTML.EditorFor() und Benutzerdefinierte EditorTemplates

Klassisches Beispiel: Produkt hat Kategorie. ProductEditor verfügt über eine DropDownList für Kategorie, die die Namen aller Kategorien enthält. Der ProductEditor wird stark nach Produkt typisiert und wir müssen die SelectList der Kategorien sowie das Produkt übergeben.

Mit einer Standardansicht würden wir die Modelldaten in einen neuen Typ umhüllen und weitergeben. Mit der EditorTemplate verlieren wir einen Teil der Standardfunktionalität, wenn wir ein gemischtes Model mit mehr als einem Objekt übergeben (als erstes bemerkte ich, dass alle LabelFor/TextBoxFor-Methoden Entitätsnamen wie "Model.Object" und nicht nur "Object" erzeugten ").

Mache ich es falsch oder sollte Html.EditorFor() einen zusätzlichen ViewDataDictionary/Model-Parameter haben?

Antwort

13

Sie können entweder eine benutzerdefinierte Ansichtsmodell erstellen, die beide Eigenschaften hat, oder Sie werden Viewdata verwenden müssen, um in diese Informationen zu übergeben.

+2

Natürlich ist dies sinnvoll, aber ich konnte nicht umhin zu bemerken, dass das Modell in einem benutzerdefinierten Platzierung Ansichtsmodell der Formularfeldnamen verursacht durch die Eigenschaft Namen des Objekts in dem benutzerdefinierten Ansichtsmodell vorangestellt werden. Nicht, dass dies ein Problem ist, aber es fügt einen weiteren Schritt zur Aktualisierung des Modells hinzu. Ich weine wahrscheinlich unnötig, eh? –

5

ich noch lernen, aber ich hatte ein ähnliches Problem, für das ich gearbeitet Lösung. Meine Kategorie ist eine Enumeration, und ich verwende ein Template-Steuerelement, das die Enumeration untersucht, um den Inhalt für das Select-Tag zu bestimmen.

Es ist in der Ansicht verwendet wird, wie:

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

Die Enum für die Kategorie mit Beschreibung dekoriert Attribute wie die Textwerte in den Auswählen von Elementen verwendet werden soll:

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

Die SelectListForEnum Konstrukte die Liste der Auswahlelemente unter Verwendung der Aufzählungsdefinition und des Indexes für das gegenwärtig ausgewählte Element wie folgt:

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

Das Endergebnis ist eine schön präsentierte DDL.

Hoffe, das hilft. Alle Kommentare über bessere Möglichkeiten werden sehr geschätzt.

Verwandte Themen