MVC Sélectionner de la Liste avec le Modèle à la publication, comment?
Je suis en train de créer une vue qui aura besoin de 2 listes déroulantes avec MVC 3. Dans mon autre MVC application, nous avons utilisé la Telerik controls qui a utilisé la méthode Ajax pour charger les données. Maintenant sur ce projet, nous n'utilisons pas de contrôles tiers, donc je vais utiliser le MVC SelectList
pour les listes déroulantes. J'ai lu beaucoup d'articles sur la façon de remplir une SelectList
mais aucun d'eux de dire deux fois la même chose, toujours d'une manière différente pour créer le modèle, certains utilisent ViewData
ou ViewBag
de tenir les collections et passer à l'affichage, etc.. pas de cohérence.
Quelle est la meilleure méthode pour remplir une liste déroulante dans un MVC vue qui utilise le modèle lui-même pour les données, pas ViewData
. Et lorsque l'utilisateur effectue une sélection dans la liste, présente et la HttpPost
action est appelé, comment puis-je accéder à la valeur sélectionnée de la propriété du Modèle de la liste de sélection de la propriété?
C'est mon Modèle actuel:
public class TemporaryRegistration {
[Required]
[Email(ErrorMessage = "Please enter a valid email address.")]
[Display(Name = "Email address")]
public string Email { get; set; }
[Required]
[Integer]
[Min(1, ErrorMessage = "Please select an entity type.")]
[Display(Name = "Entity Type")]
public IEnumerable<SelectListItem> EntityType { get; set; }
[Required]
[Integer]
[Min(1, ErrorMessage = "Please select an associated entity.")]
[Display(Name = "Associated Entity")]
public IEnumerable<SelectListItem> AssociatedEntity { get; set; }
}
C'est mon point de vue actuel, c'est seulement en utilisant TextBoxFor
où j'ai besoin d'utiliser les listes déroulantes, comment puis-je les transforme en des listes déroulantes?
@model Web.Models.TemporaryRegistration
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>Create New ELM Select User</legend>
<div class="editor-label">
@Html.LabelFor(model => model.Email)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Email)
@Html.ValidationMessageFor(model => model.Email)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.EntityType)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.EntityType)
@Html.ValidationMessageFor(model => model.EntityType)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.AssociatedEntity)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.AssociatedEntity)
@Html.ValidationMessageFor(model => model.AssociatedEntity)
</div>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
C'est mon Poste actuel de l'action:
Comment puis-je obtenir les valeurs sélectionnées?
[HttpPost]
public ActionResult CreateUser(TemporaryRegistration registrationModel) {
string newRegistrationGUID = string.Empty;
if (!ModelState.IsValid) {
return View();
}
TemporaryRegistrationEntity temporaryRegistration = null;
temporaryRegistration = new TemporaryRegistrationEntity(registrationModel.Email, registrationModel.EntityType, registrationModel.AssociatedEntity);
newRegistrationGUID = temporaryRegistration.Save();
return Content("New registration was created with GUID " + newRegistrationGUID);
}
OriginalL'auteur CD Smith | 2012-01-05
Vous devez vous connecter pour publier un commentaire.
Continue de commentaire...
Disons que vous avez un Modèle appelé
Toy
. Jouet a des propriétés commeName
,Price
, etCategory
:Maintenant, vous voulez construire une Vue de formulaire pour ajouter un
Toy
, et les gens doivent être en mesure de choisir une catégorie à partir d'une liste déroulante de possibilités... mais vous ne voulez pas le faire viaViewData
ouViewBag
pour une raison quelconque.Au lieu de passer le Modèle de la Vue, de créer un
ToyViewModel
qui aName
,Price
,Category
... mais aussi a une collection de catégories pour remplir la liste déroulante:Maintenant votre contrôleur n'ceci:
Votre point de Vue est lié au ViewModel, et que vous utilisez le
model.Categories
collection de remplir votre liste déroulante. Il devrait ressembler à quelque chose comme:Lorsque vous le soumettre, votre contrôleur n'quelque chose comme:
Il est de bonne pratique de faire des ViewModels pour la liaison à Vue de sorte que vous pouvez les adapter aux besoins de votre couche de présentation, tout en ayant vos Modèles de rester près de la couche de données et la logique métier.
Je ne vois pas comment c'est en quelque sorte différent de l'original post. Le modèle de vue dans le post original est
TemporaryRegistration
et l'entité/de la persistance du modèle estTemporaryRegistrationEntity
. La seule différence avec l'original dans cette réponse à tout, c'est que la vôtre laisse de côté les métadonnées et utilise le exact même motif, y compris pour les catégories, j'avais utilisé, qui est ce que la question était de savoir...Merci, vous deux ensemble m'a aidé à voir le tableau d'ensemble et il semble que je suis en train de faire de la bonne façon. TemporaryRegistrationEnitity est vraiment un modèle d'affaires alors que TemporaryRegistration est simplement le viewmodel. Je suis à la renommer TemporaryRegistrationViewModel pour plus de clarté.
pour moi, ce n'était pas évident de savoir comment a été l'aide de ses modèles, et
2.
la différence entre nos postes, c'est que je fourni d'explication à propos de la modélisation et vous n'avez pas. J'ai commencé à expliquer cela dans les commentaires sur vos réponses fil parce que je sentais que c'était important, mais ne voulait pas "voler votre réponse". Évidemment, il n'y avait pas assez de place. Si vous souhaitez que le crédit, je suis très bien avec ça.Pour le record, je +1 à votre réponse et votre premier commentaire long avant que j'ai posté quelque chose de mon propre.
OriginalL'auteur one.beat.consumer
La
EntityType
n'a pas besoin d'être une liste, sauf si vous acceptez de multiples valeurs de retour (comme par exemple une zone de liste serait de les envoyer). Lorsque vous affichez la liste déroulante (qui, en général, sélectionne une valeur unique) sur la vue, vous avez juste besoin de fournir le choix d'une autre manière, comme l'envoi de la liste dans une autre propriété du modèle de vue.Puis utilisez la liste déroulante helper.
oui, c'est correct.
Ok génial, merci!
NickLarsen est droite, mais la clé ici est que vous devez être la création d'un ViewModel de la vue... ce point de vue le modèle de votre Modèle de propriétés et d'une Liste ou à un ensemble d'options/choix utilisé pour remplir la liste déroulante. En passant votre modèle directement est en quelque sorte une mauvaise pratique.
tu veux dire dans mes méthode d'action correct? Pouvez-vous donner un exemple de ce que tu veux dire? Je pense que je sais où vous allez avec ce commentaire, mais voudrais clarifation... merci
OriginalL'auteur Nick Larsen