Frage

Mit MVC 2 der Zugabe des Htmlhelper EditorFor (), ist es nicht möglich, stark typisierte Anzeige und Editor-Vorlagen für ein bestimmtes Modell-Objekt zu erstellen und nach damit dem Hantieren Ich bin ein bisschen ratlos, wie zusätzliche Modelldaten zu übergeben die Editor, ohne die starke Typisierung des Editors die Kontrolle zu verlieren.

Classic Beispiel: Das Produkt hat Kategorie. ProductEditor hat ein Dropdownlist für die Kategorie mit den Namen aller Kategorien enthält. Der ProductEditor ist stark an Produkt eingegeben, und wir müssen in der Select von Kategorien sowie das Produkt zu übergeben.

Mit einer Standardansicht würden wir die Modelldaten in einer neuen Art wickeln und passieren, dass entlang. Mit dem EditorTemplate wir einige der Standard-Funktionalität zu verlieren, wenn wir in einem gemischten Modell, das mehr als ein Objekt (erste, was mir auffiel passieren war all die LabelFor / TextBoxFor Methoden produzierten Einheit Namen wie „Model.Object“ und nicht nur „Objekt „).

Bin ich es falsch oder sollte Html.EditorFor () zu tun haben einen zusätzlichen Viewdatadictionary / Model Parameter?

War es hilfreich?

Lösung

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

Andere Tipps

Ich bin immer noch lernen, aber ich hatte ein ähnliches Problem, für die ich eine Lösung ausgearbeitet. Meine Kategorie ist eine Enumeration und ich benutze eine Vorlage Kontrolle, die die Aufzählungsuntersucht die Inhalte für den Select-Tag zu bestimmen.

Es ist in der Ansicht als:

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

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

 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 baut die Liste der Elemente auswählen, die Enum-Definition und den Index für das aktuell ausgewählte Element verwendet wird, 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 ein schön präsentiert DDL.

Hoffe, das hilft. Irgendwelche Kommentare über bessere Möglichkeiten, dies zu tun, wird sehr geschätzt.

Versuchen Sie es mit ViewData.ModelMetadata all Ihrer Klasse Anmerkungen enthält.

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top