Domanda

Con l'aggiunta di MVC 2 di HtmlHelper EditorFor () non è possibile creare modelli di display ed editor fortemente tipizzati per un determinato oggetto Modello e dopo aver armeggiato con esso sono un po 'sconcertato su come passare ulteriori dati del Modello al editor senza perdere la tipizzazione forte del controllo dell'editor.

Esempio classico: il prodotto ha categoria. ProductEditor ha un elenco a discesa per la categoria contenente i nomi di tutte le categorie. ProductEditor è fortemente tipizzato sul Prodotto e dobbiamo passare dall'Elenco delle categorie e dal Prodotto.

Con una vista standard avremmo avvolto i dati del Modello in un nuovo tipo e li avremmo passati. Con l'EditorTemplate perdiamo alcune delle funzionalità standard se passiamo in un modello misto contenente più di un oggetto (la prima cosa che ho notato era che tutti i metodi LabelFor / TextBoxFor producevano nomi di entità come " Model.Object " anziché solo " ; oggetto ".)

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

È stato utile?

Soluzione

Puoi creare un ViewModel personalizzato con entrambe le proprietà OPPURE dovrai utilizzare ViewData per passare tali informazioni.

Altri suggerimenti

Sto ancora imparando, ma ho avuto un problema simile per il quale ho trovato una soluzione. La mia categoria è un enum e utilizzo un controllo modello che esamina l'enum per determinare i contenuti per il tag Select.

È usato nella vista come:

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

L'enum per Categoria è decorato con gli attributi Descrizione da utilizzare come valori di testo negli elementi 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; }
        }

SelectListForEnum costruisce 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. Eventuali commenti su modi migliori per farlo saranno molto apprezzati.

Prova a utilizzare ViewData.ModelMetadata che contiene tutte le annotazioni della tua classe.

Articolo eccellente http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-4-custom-object-templates.html

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top