2013-04-08 10 views
9

Próbuję zapełnić DropDownList i uzyskać wybraną wartość, kiedy przesłać formularz:Uzyskaj wybraną wartość DropDownList. Asp.NET MVC

Oto mój model:

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

Moi Kontrolery:

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

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

Kiedy klikam, pa rameter "book" w akcji jest zawsze pusty. Co robię źle?

Odpowiedz

17

W języku HTML rozwijane pole wysyła tylko proste wartości skalarne. W twoim przypadku to byłoby id wybranej książki:

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

a następnie dostosować działanie kontrolera tak, że będzie pobierać książki z identyfikatorem, który zostanie przekazany do działania kontrolera:

[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

Działa! Wielkie dzięki :) –

+0

Mam inne pytanie na ten temat. W rzeczywistości wybrana wartość DropDownList zwraca wartość 'ToString()' metody 'Book'. Muszę więc umieścić Ids w mojej liście DropDownList, ale chciałbym, aby na liście była wyświetlana nazwa i wybrana wartość, która ma być identyfikatorem. Czy jest jakiś sposób na zrobienie tego? Na razie używam tego sposobu: metoda 'ToString()' zwraca "Id - Title" i używam 'SubString()', aby zachować tylko identyfikator. Ale chciałbym, aby DropDownList wyświetlał tylko tytuł bez identyfikatora. –

+0

Klasa 'SelectList', którą przechodzisz do DropDown, to' IEnumerable ', gdzie' SelectListItem' ma 2 właściwości: 'Wartość' i' Tekst'. Możesz ustawić "Wartość" na "Id" swojej instancji Book i "Text" na dowolny format. –

1

można użyć DropDownListFor jak poniżej, więc prostsze

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

(trzeba silnie typami widoku tego - widok worka nie jest odpowiednia dla dużych list)

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

Myślę, że jest to łatwiejsze w użyciu.

Powiązane problemy