2009-08-05 3 views
11

Con l'aggiunta di HtmlHelper EditorFor() di MVC 2 non è possibile creare modelli di visualizzazione e di editor fortemente tipizzati per un determinato oggetto Modello e dopo averli giocati io Sono un po 'perplesso su come passare ulteriori dati del modello all'editor senza perdere la forte tipizzazione del controllo dell'editor.ASP.NET MVC 2 - HTML.EditorFor() e Custom EditorTemplates

Esempio classico: prodotto con categoria. ProductEditor ha una DropDownList per categoria contenente i nomi di tutte le categorie. ProductEditor è fortemente digitato sul prodotto e dobbiamo passare nell'elenco delle categorie e al prodotto.

Con una vista standard avremmo avvolto i dati del modello in un nuovo tipo e lo inoltreremo. Con EditorTemplate perdiamo alcune delle funzionalità standard se passiamo in un modello misto contenente più di un oggetto (la prima cosa che ho notato è che tutti i metodi LabelFor/TextBoxFor producevano nomi di entità come "Model.Object" piuttosto che "Object" ").

Sto sbagliando o Html.EditorFor() ha un parametro ViewDataDictionary/Model aggiuntivo?

risposta

13

È possibile creare un costume ViewModel, che ha sia proprietà o avrete bisogno di usare Viewdata per passare le informazioni in.

+2

Naturalmente questo ha un senso, ma non ho potuto fare a meno di notare che l'inserimento del modello in un personalizzato ViewModel fa sì che i nomi dei campi modulo per essere preceduto dal nome della proprietà dell'oggetto nel costume ViewModel. Non che questo sia un problema, ma aggiunge un altro passo all'aggiornamento del modello. Probabilmente sto piagnucolando inutilmente eh? –

5

sto ancora imparando, ma ho avuto un problema simile per il quale ho lavorato un soluzione. La mia categoria è un enum e utilizzo un controllo modello che esamina l'enum per determinare il contenuto del tag Select.

E 'utilizzato nella vista come:

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

L'enum per la categoria è decorata con Descrizione attributi per essere utilizzato come i valori di testo nelle voci Seleziona:

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

i costrutti SelectListForEnum l'elenco di elementi selezionati utilizzando la definizione enum e l'indice per l'elemento attualmente selezionato, come segue:

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

Il risultato finale è un DDL ben presentato.

Spero che questo aiuti. Qualsiasi commento su modi migliori per farlo sarà molto apprezzato.