2013-04-08 4 views
9

Я пытаюсь заполнить DropDownList и получить выбранное значение, когда я отправить форму:Получить выбранное значение DropDownList. Asp.NET MVC

Вот моя модель:

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

Мои контроллеры:

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

Моя форма:

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

Когда я нажимаю, ПА rameter 'book' в Action всегда имеет значение null. Что я делаю неправильно?

ответ

17

В HTML раскрывающийся список отправляет только простые скалярные значения. В вашем случае это будет идентификатор выбранной книги:

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

, а затем адаптировать действие контроллера, так что вы будете получать книги из Ид, которая будет послана на ваш контроллер действий:

[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

Это работает! Спасибо большое :) –

+0

У меня есть еще один вопрос об этом. Фактически, выбранное значение DropDownList возвращает значение 'ToString()' метода 'Book'. Итак, я должен поместить идентификаторы в свой DropDownList, но мне бы хотелось, чтобы в списке отображалось название и выбранное значение Id. Есть ли способ сделать это? В настоящее время я использую этот способ: метод 'ToString()' возвращает «Id - Title», и я использую 'SubString()', чтобы сохранить только Id. Но я бы хотел, чтобы DropDownList отображал только заголовок без Id. –

+0

Класс 'SelectList', который вы передаете DropDown, представляет собой' IEnumerable ', где' SelectListItem' имеет 2 свойства: 'Value' и' Text'. Вы можете установить 'Value' в' Id' экземпляра вашей книги и 'Text' в любом формате, который вы хотите. –

1

Вы можете использовать DropDownListFor, как показано ниже, это так проще

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

(Вы должны строго типизированные для этого - View сумки не подходит для больших списков)

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

Я думаю, что это проще в использовании.

Смежные вопросы