11
votes

ASP.NET MVC 2 - HTML.EDITORORFOR () et CUSTOM EDITORTEMPATES

avec l'addition de MVC 2 de l'éditeur HTMLHELPER (), il n'est pas possible de créer des modèles d'affichage et d'éditeur fortement dactylographiés pour un objet de modèle donné et après le violon avec celui-ci, je suis un peu soupliée sur la manière de transmettre des données de modèle supplémentaires à la éditeur sans perdre la dactylographie forte du contrôle de l'éditeur.

Exemple classique: Le produit a une catégorie. Producteur a une liste déroulante pour la catégorie contenant les noms de toutes les catégories. Le produit est fortement tapé au produit et nous devons transmettre la sélection de catégories ainsi que le produit.

Avec une vue standard, nous envelopperions les données de modèle dans un nouveau type et transmettront que. Avec la plaque EditorTemplate, nous perdons une partie de la fonctionnalité standard si nous passons dans un modèle mixte contenant plusieurs objets (la première chose que j'ai remarquée était que toutes les méthodes Labelfor / Textboxfor produisaient des noms d'entités tels que "Model.Object" plutôt que " ")).

Est-ce que je le fais mal ou si html.editororfor () ayez un paramètre ViewdAndiction / modèle supplémentaire?


0 commentaires

3 Réponses :


13
votes

Vous pouvez soit créer une vue personnalisée qui a à la fois des propriétés ou vous devez utiliser ViewData pour transmettre ces informations.


1 commentaires

Naturellement, cela a du sens mais je ne pouvais pas m'empêcher de noter que la mise en place du modèle dans une vue personnalisée provoque la préfixe des noms de champs de formulaire par le nom de la propriété de l'objet dans la vue personnalisée. Ce n'est pas que ceci est un problème, mais il ajoute une autre étape pour mettre à jour le modèle. Je me plie probablement inutilement hein?



5
votes

J'apprends toujours, mais j'ai eu un problème similaire pour lequel j'ai élaboré une solution. Ma catégorie est une énumération et j'utilise un contrôle de modèle qui examine l'ENum pour déterminer le contenu de la balise Select.

Utilisé à la vue comme suit: p>

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


0 commentaires

4
votes

Essayez d'utiliser ViewData.ModelmeTADAta Cela contient toutes vos annotations de classe.

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


1 commentaires

Merci beaucoup. Je cherchais cela depuis des jours maintenant, j'ai oublié de marquer la dernière fois que je suis tombé sur elle.