2013-04-17 11 views
10

Ich habe Probleme mit der Dropdown-Liste für HTML-Helper in MVC. Wenn das Zurücksetzen erfolgt, ist nichts ausgewählt und die Werte im Modell für die Liste und das ausgewählte Element sind null.MVC DropDownListFor Null Werte

Hier meine Modelle sind:

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


    } 
} 

und Aussicht:

@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> 

Wenn ich etwas aus der Auswahlliste auswählen und auf die Schaltfläche nulls einreichen klicken sind zurückgegeben:

nullselect

Kann jemand etwas Licht auf das werfen, was ich falsch mache?

Antwort

19

Das Problem, das Sie in ausgeführt ist, dass MVC nicht weiß, wie der ausgewählte Wert der Dropdown-Liste übersetzen die (was ein String) Objekt Mitglied.

Was Sie tun sollten, ist eine selectedValue -Eigenschaft, die verwendet wird, um den Wert in der Dropdown-Liste festzulegen und den zurückgegebenen Wert abzurufen.

Neue Kunde Klasse:

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

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

    public string selectedValue { get; set; } 

    public Member selected { get; set; } 
} 

Aktualisiert Dropdown-Liste Kontrolle:

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

Dadurch wird den ausgewählten Wert aus der Dropdown-Liste in das Eigentum selectedValue zurückzukehren.

Der Grund dafür, dass Ihre Mitgliederliste NULL ist, liegt daran, dass HTML die Optionen in einer Dropdown-Liste nicht zurückgibt, sondern nur den ausgewählten Wert zurückgibt. Wenn die Information in die Methode kommt, erhält sie nur die Werte der Eingabeformulare.

Wenn Sie sehen möchten, welche Informationen wird an den Server zurückgesendet Sie die Entwickler-Konsole verwenden können, und erfassen die Rückkehr Http Anfrage

und/oder

Sie können FormCollection collection auf die Parameter des Reglers hinzufügen Aktion, um zu sehen, welche Informationen MVC verwendet, um die Objekte zu erstellen, die an die Methoden übergeben werden.

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

    return View(); 
} 
+0

Ahh natürlich. Vielen Dank Stephen. Einfach, wenn Sie wissen wie. –

+0

+1 für "Sie können FormCollection-Auflistung den Parametern der Controller-Aktion hinzufügen, um zu sehen, welche Informationen MVC verwendet, um die Objekte zu erstellen, die an die Methoden übergeben werden." Ich habe versehentlich Attributform für ein anderes Formular gesetzt, und ich dachte für einige Stunden, dass mein DropDownListFor Guid nicht zurückgeben möchte ... FormCollection sagte mir, dass das Problem Form nicht Modell ist – cadi2108

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

Try Wert zu setzen:

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

Nein funktioniert immer noch nicht. Guter Versuch, tho :) Ich dachte, dass es nach einem Facepalm getan haben könnte, aber nicht gehen, es ist immer noch Null. Ich versuchte auch, das cust.selected zu einem SelectListItem zu ändern und dieses funktionierte auch nicht. –

+1

@ChristopherTownsend Ändern der Helfereigenschaft '@ Html.DropDownListFor (Modell => Modell.Ausgewählt.Name, Modell.members, "- Select -") 'und create object in der GET-Aktion' new Customer() {name = "Cust1", ausgewählt = new Member()} ' – webdeveloper

-3

Verwenden Sie jQuery vor, um das Problem mit Leichtigkeit zu beheben.

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