2013-04-08 25 views
9

Sto cercando di popolare una DropDownList e per ottenere il valore selezionato quando inviare il modulo:Ottieni il valore selezionato di DropDownList. Asp.NET MVC

Ecco il mio modello:

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

miei Controllers:

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

mio Forma:

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

Quando scatto, la pa il "libro" del rameter nell'azione è sempre nullo. Cosa sto sbagliando?

risposta

17

In HTML una casella a discesa invia solo valori scalari semplici. Nel tuo caso, che sarebbe l'id del libro selezionato:

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

e quindi adattare la vostra azione di controllo in modo che si recuperare il libro dalla id che viene passato alla tua azione di controllo:

[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

Funziona! Grazie mille :) –

+0

Ho un'altra domanda al riguardo. Infatti, il valore selezionato DropDownList restituisce il valore del metodo 'ToString()' di 'Book'. Quindi devo inserire gli ID nel mio DropDownList, ma vorrei che l'elenco visualizzasse il titolo e il valore selezionato come ID. C'è un modo per farlo? Per ora, io uso in questo modo: il metodo 'ToString()' restituisce "Id - Title" e io uso 'SubString()' per mantenere solo l'Id. Ma mi piacerebbe che DropDownList mostrasse solo il Titolo senza l'Id. –

+0

La classe 'SelectList' che si sta passando a DropDown è un' IEnumerable 'dove' SelectListItem' ha 2 proprietà: 'Value' e' Text'. È possibile impostare il valore su "Id" dell'istanza di Book e su "Text" in qualsiasi formato si desideri. –

1

È possibile utilizzare DropDownListFor come sotto, E 'così semplice

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

(Hai bisogno di una visione fortemente tipizzato per questo - Vedi borsa non è adatto a grandi liste)

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

Penso che sia più semplice da usare.

Problemi correlati