2013-04-17 6 views
10

Je rencontre des problèmes lors de l'utilisation de la liste déroulante pour htmlhelper dans MVC. Lorsque le post-retour se produit, il n'y a rien sélectionné et les valeurs dans le modèle pour la liste et l'élément sélectionné sont null.MVC DropDownListFor Null Values ​​

Voici mes modèles:

namespace MvcTestWebApp.Models 
{ 
    public class Customer 
    { 
     public string name { get; set; } 

     public List<SelectListItem> members { get; set; } 

     public Member selected { get; set; } 
    } 

    public class Member 
    { 
     public string name { get; set; } 

    } 
} 

Controller:

namespace MvcTestWebApp.Models 
{ 
    public class CustomerController : Controller 
    { 
     // 
     // GET: /Customer/ 
     public ActionResult Index() 
     { 
      Customer cust = new Customer() { name = "Cust1" }; 
      cust.members = new List<SelectListItem>(); 

      cust.members.Add(new SelectListItem(){Text = "Bob"}); 
      cust.members.Add(new SelectListItem(){Text = "Dave"}); 

      return View(cust); 
     } 

     [HttpPost] 
     public ActionResult Index(Customer customer) 
     { 

      return View(); 
     } 


    } 
} 

Et Vue:

@model MvcTestWebApp.Models.Customer 

@{ 
    ViewBag.Title = "Customer"; 
    Layout = null; 
} 

<!DOCTYPE html> 

<html> 

<head> 
    <meta name="viewport" content="width=device-width" /> 
    <title> Index </title> 
</head> 

    <body> 


@using (Html.BeginForm()) { 
    @Html.ValidationSummary(true) 

    <fieldset> 
     <legend>Customer Data</legend> 

      @Html.HiddenFor(model => model.name) 

      @Html.DropDownListFor(model => model.selected, Model.members, "--Select--") 

     <p> 
      <input type="submit" value="Save" /> 
     </p> 

     </fieldset> 
} 

    </body> 

</html> 

Lorsque je sélectionne quelque chose dans la liste de sélection et cliquez sur le bouton Soumettre nulls sont retourné:

nullselect

Quelqu'un peut-il faire la lumière sur ce que je fais mal?

Répondre

19

La question que vous exécutez en est que MVC ne sait pas comment traduire la valeur sélectionnée de la liste déroulante (qui est une chaîne) à la Membre d'objet

Ce que vous devez faire est d'avoir une propriété selectedValue qui est utilisée pour définir la valeur dans la liste déroulante et récupérer la valeur retournée.

nouvelle classe client:

public class Customer 
{ 
    public string name { get; set; } 

    public List<SelectListItem> members { get; set; } 

    public string selectedValue { get; set; } 

    public Member selected { get; set; } 
} 

Mise à jour le contrôle de la liste déroulante:

@Html.DropDownListFor(model => model.selectedValue, Model.members, "--Select--") 

Ceci renvoie la valeur sélectionnée dans la liste déroulante dans la selectedValue propriété.

La raison pour laquelle votre liste de membres est renvoyée nulle est que HTML ne renvoie pas les options dans une liste déroulante, elle renvoie uniquement la valeur sélectionnée. Ainsi, lorsque l'information entre dans la méthode, elle ne reçoit que les valeurs des formulaires d'entrée.

Si vous voulez voir ce que l'information est envoyée au serveur, vous pouvez utiliser la console développeur et capturer le retour Http demande

et/ou

Vous pouvez ajouter FormCollection collection aux paramètres du contrôleur Action pour voir quelles informations MVC utilise pour construire les objets qu'il transmet aux méthodes.

[HttpPost] 
public ActionResult Index(Customer customer, FormCollection collection) 
{ 

    return View(); 
} 
+0

Ahh bien sûr. Merci beaucoup Stephen. Facile quand tu sais comment. –

+0

+1 pour "Vous pouvez ajouter la collection FormCollection aux paramètres de l'action du contrôleur pour voir quelles informations MVC utilise pour construire les objets qu'elle transmet aux méthodes." J'ai accidentellement mis un formulaire d'attribut pour un autre formulaire et j'ai pensé pendant quelques heures, que mon DropDownListFor ne veut pas retourner Guid ... FormCollection m'a dit, que le problème est la forme pas le modèle – cadi2108

0
cust.members.Add(new SelectListItem(){Text = "Bob"}); 
cust.members.Add(new SelectListItem(){Text = "Dave"}); 

Essayez de définir la valeur:

cust.members.Add(new SelectListItem(){Value = "Bob", Text = "Bob"}); 
cust.members.Add(new SelectListItem(){Value = "Dave", Text = "Dave"}); 
+0

Non ne fonctionne toujours pas. Bon essai tho :) Je pensais que cela aurait pu le faire après un visagepalm mais pas de go, c'est toujours nul. J'ai également essayé de changer le cust.selected à un SelectListItem et ceci n'a pas fonctionné non plus. –

+1

@ChristopherTownsend Modifier la propriété d'assistance '@ Html.DropDownListFor (model => model.selected.name, Model.membres, "--Sélectionner" ")' et créer un objet dans l'action GET 'nouveau client() {name =" Cust1 ", selected = new Member()}' – webdeveloper

-3

Utilisez jQuery pour résoudre le problème en toute simplicité.

$("#idOfSelectTag").prepend(' 
           <option selected="selected" value="null"> 
           -- Select School -- 
           </option> 
          '); 
Questions connexes