web-dev-qa-db-fra.com

Différence entre DropDownlist ou DropDownListFor Html helper

Il semble étrange que je n'ai pas pu trouver d'explication de la différence entre ces deux aides, donc je suppose que c'est quelque chose d'évident mais j'ai raté.

Fondamentalement, j'essaie de décider lequel je dois utiliser pour mon cas, avec le modèle simple suivant:

public class Booking
    {
        public int ID { get; set; }
        public Room Room { get; set; }
        public DateTime StartTime { get; set; }
        public DateTime EndTime { get; set; }
        public ICollection<Equipment> Equipments { get; set; }
        public string Who { get; set; }
    }

et je souhaite afficher une liste déroulante de pièce simple pour ajouter et modifier l'enregistrement de réservation.

Après avoir fait beaucoup de choses sur Google, il semble que j'ai probablement besoin d'un DropDopwListFor, mais je ne sais pas pourquoi et comment?

42
Paul L

Prenez les deux exemples suivants:

@Html.DropDownListFor(
    x => x.EquipmentId, 
    new SelectList(Model.Equipments, "Id", "Text")
)

et:

@Html.DropDownList(
    "EquipmentId", 
    new SelectList(Model.Equipments, "Id", "Text")
)

Il est évident qu'avec le deuxième exemple, le nom de la propriété à laquelle vous liez la liste déroulante est codé en dur comme une chaîne magique. Cela signifie que si vous décidez de refactoriser votre modèle et de renommer cette propriété, le support d'outillage que vous utilisez peut-être n'a aucun moyen de détecter ce changement et de modifier automatiquement la chaîne magique que vous avez codée en dur dans potentiellement de nombreuses vues. Vous devrez donc rechercher et remplacer manuellement partout où cet assistant faiblement typé est utilisé.

Avec le premier exemple, nous utilisons une expression lambda fortement typée liée à la propriété de modèle donnée afin que les outils puissent le renommer automatiquement partout où il est utilisé si vous décidez de refactoriser votre code. De plus, si vous décidez de précompiler vos vues, vous obtiendrez une erreur de temps du compilateur pointant immédiatement vers la vue à corriger. Avec le deuxième exemple, vous (idéalement) ou les utilisateurs de votre site (pire scénario) obtiendrez une erreur d'exécution lorsqu'ils visiteront cette vue particulière.

Les assistants fortement typés ont été introduits pour la première fois dans ASP.NET MVC 2 et la dernière fois que j'ai utilisé un assistant faiblement typé était dans une application ASP.NET MVC 1 il y a longtemps.

85
Darin Dimitrov

DropDownListFor sélectionnera automatiquement la valeur sélectionnée en utilisant la propriété spécifiée:

// Will select the item in model.Equipments that matches Model.EquipmentId
@Html.DropdownListFor(m => m.EquipmentId, Model.Equipments); 

Un autre commentaire:

Ne pas avoir ICollection<Equipment> Equipments dans votre modèle de vue. Vous devez avoir une propriété qui renvoie un IEnumerable<SelectListItem>.

6
jgauffin

Lorsque vous souhaitez ajouter une vue (fichier aspx) où cette DropDownList ou DropDownListFor sera à l'intérieur, faites un clic droit-> ajouter une vue puis sélectionnez "Créer une vue fortement typée" puis dans la liste, sélectionnez Booking classe. Après cela, ajoutez cette page.

Vous pouvez l'écrire comme suit:

@Html.DropdownListFor(m => m.Equipments , Model.Equipments);

parce que nous ajoutons une vue fortement typée comme Booking, vous pouvez avoir:

m => m.ID, m => m.Room, m => m.StartTime

... etc.

Dans vos services, vous pouvez disposer de méthodes pour extraire des données de la base de données, puis utiliser la méthode de ce service dans votre contrôleur pour transmettre les données de la base de données à afficher. Vous pouvez utiliser ViewData dans votre contrôleur:

ViewData["Equipments"] = new servicename().getdatalistfromdatabase().AsEnumarable();

Mettre AsEnumarable() à la fin de votre liste tirée de la base de données en fait IEnumarable.

Ensuite, selon vous, vous pouvez également avoir:

@Html.DropdownList("MyEquipments" , ViewData["Equipments"]);

Un lien sur l'utilisation de ViewData: http://msdn.Microsoft.com/en-us/library/dd410596.aspx

J'espère que cela vous aide.

2
cemsazara

DropdownListFor est un support fortement typé et son nom est assigné par expression lambda afin qu'il affiche l'erreur de compilation si vous en avez.

DropdownList ne supporte pas cela.

2
Sabuj Sen