2013-04-08 4 views
9

Ich versuche, ein Dropdownlist zu füllen und den ausgewählten Wert zu erhalten, wenn ich das Formular abschicken:Ruft den ausgewählten Wert einer DropDownList ab. Asp.NET MVC

Hier ist mein Modell:

public class Book 
{ 
    public Book() 
    { 
     this.Clients = new List<Client>(); 
    } 

    public int Id { get; set; } 
    public string JId { get; set; } 
    public string Name { get; set; } 
    public string CompanyId { get; set; } 
    public virtual Company Company { get; set; } 
    public virtual ICollection<Client> Clients { get; set; } 
} 

Meine Controller:

[Authorize] 
    public ActionResult Action() 
    { 
     var books = GetBooks(); 
     ViewBag.Books = new SelectList(books); 
     return View(); 
    } 

    [Authorize] 
    [HttpPost] 
    public ActionResult Action(Book book) 
    { 
     if (ValidateFields() 
     { 
      var data = GetDatasAboutBookSelected(book); 
      ViewBag.Data = data; 
      return View(); 
     } 
     return View(); 
    } 

Meine Form:

@using (Html.BeginForm("Journaux","Company")) 
{ 
<table> 
    <tr> 
     <td> 
      @Html.DropDownList("book", (SelectList)ViewBag.Books) 
     </td> 
    </tr> 
    <tr> 
     <td> 
      <input type="submit" value="Search"> 
     </td> 
    </tr> 
</table> 
} 

Wenn ich auf die pa Rameter "Buch" in der Aktion ist immer null. Was mache ich falsch?

Antwort

17

In HTML sendet eine Dropdown-Box nur einfache skalare Werte. In Ihrem Fall, dass die ID des ausgewählten Buches wäre:

@Html.DropDownList("selectedBookId", (SelectList)ViewBag.Books) 

und dann Controller-Aktion anpassen, so dass Sie das Buch aus der ID abzurufen, die zu Ihrem Controller-Aktion übergeben wird:

[Authorize] 
[HttpPost] 
public ActionResult Action(string selectedBookId) 
{ 
    if (ValidateFields() 
    { 
     Book book = FetchYourBookFromTheId(selectedBookId); 
     var data = GetDatasAboutBookSelected(book); 
     ViewBag.Data = data; 
     return View(); 
    } 
    return View(); 
} 
+0

Es funktioniert! Vielen Dank :) –

+0

Ich habe eine andere Frage dazu. Tatsächlich gibt der ausgewählte DropDownList-Wert den Wert der 'ToString()' -Methode von 'Book' zurück. Also muss ich die IDs in meine DropDownList legen, aber ich möchte, dass die Liste den Titel und den ausgewählten Wert als ID anzeigt. Gibt es eine Möglichkeit, das zu tun? Für jetzt verwende ich diesen Weg: die 'ToString()' Methode gibt "Id - Titel" zurück und ich benutze 'SubString()', um nur die Id zu behalten. Aber ich möchte die DropDownList nur den Titel ohne die ID anzeigen. –

+0

Die Klasse 'SelectList', die Sie an DropDown übergeben, ist ein' IEnumerable ', wobei' SelectListItem' zwei Eigenschaften hat: 'Value' und' Text'. Sie könnten den 'Wert' auf die' Id' Ihrer Book-Instanz und den 'Text' auf das gewünschte Format setzen. –

1

Sie können wie unten verwenden DropDownListFor, es so einfacher

@Html.DropDownListFor(m => m.Id, new SelectList(Model.Books,"Id","Name","1")) 

(Sie müssen eine stark typisierte Ansicht für diese - Ansicht Tasche ist für große Listen nicht geeignet)

public ActionResult Action(Book model) 
    { 
     if (ValidateFields() 
     { 
      var Id = model.Id; 
     ...   

Ich denke, das ist einfacher zu bedienen.

Verwandte Themen