Comment afficher la valeur sélectionnée d'une selectlist au contrôleur à l'aide d'un modèle de vue?
Cette question a été posée dans différentes formes, mais aucune des réponses semblent correspondre à ma situation. Je suis simplement en train d'essayer de récupérer la valeur sélectionnée de la forme d'une liste déroulante dans mon contrôleur.
Voici mon code:
ViewModel.cs
public class ViewModel
{
public ViewModel() {}
public ViewModel(Contact contact, IEnumerable<State> states)
{
this.Contact = contact;
this.States = new SelectList(states, "Id", "Name", contact.StateId);
}
public Contact Contact {get;set;}
public SelectList States {get;set;}
}
Contrôleur.cs
[HttpPost]
public ActionResult Edit(ViewModel viewModel)
{
_contactService.UpdateContact(viewModel.Contact);
return RedirectToAction("Item", new {id = viewModel.Contact.Id});
}
Vue.cshtml
<button type="submit" onclick="javascript:document.update.submit()"><span>Update</span></button>//aesthic usage.
@{using (Html.BeginForm("Edit", "Controller", FormMethod.Post, new { name = "update" }))
{
@Html.HiddenFor(m => m.Contact.Id)
@Html.LabelFor(m => m.Contact.Name, "Name:")
@Html.TextBoxFor(m => m.Contact.Name)
<label for="state">State:</label>
@Html.DropDownList("state", Model.States)
}
}
Tout fonctionne comme prévu, sauf que pas de valeurs de la dropdownlist sont passés dans ma posté viewModel pour le contrôleur. La page d'édition et de tous les domaines de la charge correctement. Les listes déroulantes lier correctement et ont leurs valeurs affichées correctement. Cependant, quand je post, je seulement obtenir un "Contact" objet transmis au contrôleur. Les "États" SelectList objet est null.
J'ai essayé une cartographie de l' "StateId" bien dans mon viewModel constructeur mais cela ne fonctionne pas non plus. Ce que je fais mal?
Grâce.
Vous devez vous connecter pour publier un commentaire.
Je déteste répondre à mes propres questions, mais basé sur les multiples questions que j'avais couplé avec la multitude de réponses disponibles, j'ai pensé que je pourrais résumer mes conclusions.
Tout d'abord merci pour Filip, sa réponse n'a pas exactement pour résoudre mon problème, mais il m'a conduit dans la bonne direction. +1
Si vous créez un formulaire pour la visualisation et la modification qui nécessite une liste déroulante, ici sont quelques suggestions et de pièges. Je vais commencer avec une liste de paramètres que j'avais besoin pour l'adapter à mes besoins.
Cela peut sembler évident et facile à obtenir de la liste, mais pour quelqu'un de nouveau pour MVC, il ne l'est pas. Je vais revoir mon code ci-dessus avec des commentaires. Voici ce que j'ai fait.
ViewModel.cs
Contrôleur.cs //rien de vraiment différent de ci-dessus
Vue//grâce à la Artirto à ce post
Essayez d'utiliser
@Html.DropDownListFor
au lieu de cela, si "l'état" est une partie de votre modèle, vous pouvez l'utiliser comme ceci:@Html.DropDownListFor(m => m.Contact.StateId, Model.States, "-- Please select a State --")
oùm.State
détient la valeur sélectionnée.Également de ne pas confondre l'interface IEnumerable avec le Modèle, je dirai que le ViewBag /ViewData.
Il ressemblerait à quelque chose comme ceci à la place:
@Html.DropDownListFor(m => m.Contact.StateId, (IEnumerable<string>)ViewBag.States, "-- Please select a State --")
Et dans votre action qui renvoie ce point de vue, vous devrez initialiser l'État énumérable pour le ViewBag.Les états de la propriété.
SelectList
et ce n'est pas ce que le formulaire de post. Si vous ajoutez unstring
paramètre sur vous une action nommée "état", il doit obtenir la valeur que vous avez sélectionnée.