web-dev-qa-db-fra.com

MVC DropDownListFor Null Values

J'ai des problèmes pour utiliser la liste déroulante pour htmlhelper dans MVC. Lorsque la publication a lieu, rien n'est sélectionné et les valeurs du modèle pour la liste, ainsi que l'élément sélectionné sont nuls.

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; }

    }
}

Manette:

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 voir:

    @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 un élément de la liste de sélection et clique sur le bouton d'envoi, les valeurs NULL sont renvoyées:

nullselect

Quelqu'un peut-il nous éclairer sur ce que je fais mal?

11

Le problème que vous rencontrez est que MVC ne sait pas comment traduire la valeur sélectionnée de la liste déroulante (qui est une chaîne) en objet membre.

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 renvoyée.

Nouveau 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 du contrôle de la liste déroulante:

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

Cela retournera la valeur sélectionnée de la liste déroulante dans la propriété selectedValue.

La raison pour laquelle votre liste de membres est renvoyée null est parce que HTML ne renvoie pas les options d'une liste déroulante, il ne renvoie que la valeur sélectionnée. Ainsi, lorsque l’information entre dans la méthode, il n’est donné que les valeurs des formulaires en entrée.

Si vous voulez voir quelles informations sont renvoyées au serveur, vous pouvez utiliser la console du développeur et capturer la requête HTTP renvoyée.

et/ou

Vous pouvez ajouter FormCollection collection aux paramètres de l'action du contrôleur pour voir les informations utilisées par MVC pour générer les objets qu'il transmet aux méthodes.

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

  return View();
}
21
SBurris
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
webdeveloper