@ Html.DropDownListFor Utilisation de base
Je viens juste de commencer à apprendre MVC4 et je dois avouer que je suis un peu remis en question par toutes le recours à des expressions lambda, les génériques et les types anonymes, surtout quand il y a beaucoup de fonctions surchargées. C'est un peu déroutant pour essayer de comprendre comment le code HTML Helpers de travail. Prendre le "DropDownListFor" Helper, par exemple. J'ai essayé d'extraire l'essentiel de mon code. C'est pourquoi vous voyez seulement une seulement une seule colonne, le "Genre", dans la table. J'espère que c'est encore syntaxiquement correct:
@model IEnumerable<BusinessLayer.Employee>
<table>
@foreach (var employee in Model)
{
<tr>
<td>
@{
var listItems = new List<SelectListItem>()
{
new SelectListItem {Text = "Male", Value = "M"},
new SelectListItem {Text = "Female", Value = "F"}
};
@Html.DropDownListFor(m => employee.Gender, listItems, listItems.Find(i => i.Value == employee.Gender).Text)
}
</td>
</tr>
}
</table>
Il y a deux Employés dans le Modèle objet, un IEnumerable de l'Employé et le code HTML suivant est généré
<table>
<tr>
<td>
<select id="employee_Gender" name="employee.Gender"><option value="">Male</option>
<option value="M">Male</option>
<option value="F">Female</option>
</select>
</tr>
</td>
<select id="employee_Gender" name="employee.Gender"><option value="">Female</option>
<option value="M">Male</option>
<option value="F">Female</option>
</select>
</td>
</table>
En regardant le premier paramètre de la DropDownListFor Méthode,
@Html.DropDownListFor(m => employee.Gender, ...
...Ai-je bien compris que le "m" représente l'instance de la classe du modèle qui a été adopté dans la Vue? Dans la ligne des exemples que j'ai vu, j'ai vu des exemples où le "m" semble faire référence à la classe du modèle, mais où le modèle est une instance unique de la classe, par exemple, un seul objet Employé, plutôt que d'une collection d'Employés comme c'est le cas ici, où je veux afficher un tableau, la liste des Employés. Je suis en supposant que l'intention du premier paramètre de la DropDownListFor Méthode est le "point/bind" pour un propriété dans le modèle, c'est pourquoi j'ai fait m => employé.Sexe. Est-ce que je devrais être en train de faire lorsque le modèle est une collection d'Employés plutôt que d'un seul Employé? Si oui, je suis confus quant à la façon dont je peux générer des Identifiants uniques pour les deux listes déroulantes qui ont été assignée à la fois "employee_Gender" pour les attributs NAME et ID.
Pour le 3e paramètre de l'aide DropDownListFor,
listItems.Find(i => i.Value == employee.Gender).Text
Est-ce raisonnable? La valeur pour l'employé.Le genre est soit "M" ou "F", mais le Texte de l'affichage est "Masculin" et "Féminin." Je suis confus si ce paramètre est utilisé pour spécifier une valeur par défaut "AUCUN SÉLECTIONNER" première valeur ou si ce paramètre est utilisé pour sélectionner dans la liste déroulante la valeur de l'Employé actuel---ou peut-être qu'il peut faire les deux? Par exemple, sélectionnez le Texte spécifié si trouve et sinon, ajouter le texte spécifié en tant que PREMIER? paramètre si la valeur n'est pas trouvée? Cela semble être la façon dont il travaille à partir de ce que je vois. Cette 3ème param être simplifiée ou est mon exemple raisonnable?
Merci pour votre patience dans la lecture de mes nombreuses multitude de questions en essayant de mieux le comprendre.
source d'informationauteur ChadD
Vous devez vous connecter pour publier un commentaire.
Partie 1: Expliquer le Lambda de la magie
Vous n'êtes pas seul. Les Lambdas + MVC faire le codage méchants facile, mais ils ont également, il semble assez magique (en raison de l'abstraction).
Oui.
HTML Helpers + Lambdas dans de Rasoir sont simples et magiques parce qu'ils sont de prendre un raccourci et pas vraiment révélateur de ce qui se passe.
Tout d'abord, jetons un coup d'oeil à
@Html
. Nous savons@
commence notre syntaxe Razor et puisHtml
est magique. En fait,Html
est un HtmlHelper objet est automatiquement initialisé et donné à vous. Plus précisément, c'est unHtmlHelper<TModel>
. Le Rasoir éditeur HTML est intelligent et sait à l'avance quel type TModel sera basé sur ce que vous avez dit ce point de vue du type de modèle. C'est pourquoi vous avez beaucoup d'intellisense.Lorsque vous tapez
L'éditeur de lit et fait l'hypothèse que le Helper HTML sera
HtmlHelper<IEnumerable<BusinessLayer.Employee>>
. Quand vient le temps de construire la page, le helper HTML sera en fait que le type (bien sûr).Alors que sur le
DropDownListFor
ou de toute autre méthode d'extension?Regardant DropDownListFor nous pouvons voir que c'est en fait
DropDownListFor<TModel, TProperty>
. Nous comprenons maintenant que TModel est notre point de vue du type de modèle.DropDownListFor
sait à ce sujet, car la méthode est l'extension deHtmlHelper<TModel>
. Donc DropDownListFor sait que le nouveau type est le type est défini dans le haut de la vue. Qu'en estTProperty
?TProperty
est le type de retour. C'est le type que vous spécifiez lorsque vous sélectionnez votre propriété. La vue donne HtmlHelper le type de modèle, qui donne ensuite DropDownListFor le type de modèle et maintenant que vous êtes dans une expression lambda:(x => x.Property)
vous sélectionnez la propriété qui sélectionne le type pour vous; dans ce cas, un chaîne (Femmes).Partie 2: Votre problème
Il est difficile de répondre à votre question sans connaître exactement ce que vous essayez d'atteindre. Avez-vous une collection d'Employés et que vous souhaitez afficher plusieurs sexe zones de liste déroulante pour chaque, puis les enregistrer?
Lorsque vous traitez avec les collections, c'est un peu plus délicat, car MVC ne gère pas bien hors de la boîte; il est généralement préférable d'écrire vos propres solutions en fonction de ce que vous devez faire.
Je n'aime pas vraiment l'idée d'une seule vue de l'obtention d'une collection de choses sur une page. Considérer ce morceau de logique:
Votre chemin:
Ma façon
Avec MVC ne pas essayer de diviser les choses en petit, les parties logiques. Les points de vue devraient être stupide; ce qui signifie qu'ils ne doivent pas faire toute la logique ou de la pensée. Les choses deviennent plus facile de cette façon et il permet de s'assurer que votre avis ne poussent pas en monstres.
Exemple de solution de plain-pied à travers
Essayez ceci:
Créer un nouveau PartialView appelé _EmployeeGender.cshtml dans le même dossier que le point de vue que vous utilisez.
Utiliser ce code
_EmployeeGender.cshtml
Votre point de vue original
Résultats
Jetons un coup d'oeil à notre HTML généré maintenant:
Nous pouvons voir qu'il y a maintenant un vide de sélection et que nos zones de liste déroulante sont automatiquement sélectionnés avec de l'Employé valeurs (j'ai créer un mâle et une femelle de l'employé).
Ne Remarque que le
id
etname
HTML attributs sont les mêmes. Si vous souhaitez soumettre un formulaire avec ces valeurs, alors il aura besoin de plus de travail. Mais c'est un point de départ raisonnable pour vous.