Question

Avec l'ajout de HtmlHelper EditorFor () par MVC 2, il n'est pas possible de créer des modèles d'affichage et d'édition fortement typés pour un objet Model donné. Après quoi, je suis un peu perplexe sur la manière de transmettre des données de modèle supplémentaires au éditeur sans perdre la frappe forte du contrôle de l'éditeur.

Exemple classique: le produit a une catégorie. ProductEditor a une liste DropDownList pour la catégorie contenant les noms de toutes les catégories. Le ProductEditor est fortement typé à Product et nous devons transmettre la SelectList de catégories ainsi que le Product.

Avec une vue standard, nous enveloppons les données de modèle dans un nouveau type et nous les transmettons. Avec EditorTemplate, nous perdons certaines fonctionnalités standard si nous passons dans un modèle mixte contenant plusieurs objets (la première chose que j’ai constatée était que toutes les méthodes LabelFor / TextBoxFor produisaient des noms d’entité tels que "Modèle.Objet" plutôt que "simplement". ; Objet ").

Est-ce que je me trompe ou est-ce que Html.EditorFor () devrait avoir un paramètre ViewDataDictionary / Model supplémentaire?

Était-ce utile?

La solution

Vous pouvez créer un ViewModel personnalisé comportant les deux propriétés OU vous devez utiliser ViewData pour transmettre ces informations.

Autres conseils

J'apprends encore, mais j'avais un problème similaire pour lequel j'ai trouvé une solution. Ma catégorie est une énumération et j’utilise un modèle de contrôle qui examine cette énumération pour déterminer le contenu de la balise Select.

Il est utilisé dans la vue en tant que:

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

L'énumération de catégorie est décorée d'attributs de description à utiliser comme valeurs de texte dans les éléments de sélection:

 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 construit la liste des éléments sélectionnés à l'aide de la définition enum et de l'index de l'élément actuellement sélectionné, comme suit:

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

Le résultat final est un fichier DDL bien présenté.

J'espère que ça aide. Tous les commentaires sur de meilleures façons de le faire seront grandement appréciés.

Essayez d’utiliser ViewData.ModelMetadata qui contient toutes les annotations de votre classe.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top