2013-04-17 3 views
10

У меня возникли проблемы с использованием dropdownlistfor htmlhelper в MVC. Когда происходит обратная связь, ничего не выбрано, а значения в модели для списка и выбранный элемент равны нулю.MVC DropDownListFor Null Values ​​

Вот мои модели:

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

    } 
} 

Контроллер:

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


    } 
} 

А Вид:

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

Когда я выбираю что-то из списка выбора и нажмите кнопку Отправить Нуль- Возврат:

nullselect

Может ли кто-нибудь пролить свет на то, что я делаю неправильно?

ответ

19

вопрос вы работаете в том, что MVC не знаю, как перевести выбранное значение из выпадающего списка (который является строкой) к объект Member.

Что нужно сделать, это иметь свойство selectedValue, которое используется для установки значения в раскрывающемся списке и получения возвращаемого значения.

Новый класс Заказчика:

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

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

    public string selectedValue { get; set; } 

    public Member selected { get; set; } 
} 

Обновлено Dropdown управление списком:

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

Это вернет выбранное значение из выпадающего списка в собственности SelectedValue.

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

Если вы хотите увидеть, какая информация отправляется обратно на сервер, вы можете использовать консоль разработчика и захватить возвращенный запрос НТТР

и/или

Вы можете добавить FormCollection collection к параметрам контроллера чтобы узнать, какую информацию использует MVC для создания объектов, которые он передает методам.

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

    return View(); 
} 
+0

Ahh, конечно. Большое спасибо Стивен. Легко, когда вы знаете, как это сделать. –

+0

+1 для «Вы можете добавить коллекцию FormCollection к параметрам действия контроллера, чтобы узнать, какую информацию использует MVC для сборки объектов, которые он передает методам». Я случайно установил форму атрибута для другой формы, и я подумал в течение нескольких часов, что мой DropDownListFor не хочет возвращать Guid ... FormCollection сказал мне, что проблема - это не модель – cadi2108

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

Попробуйте установить значение:

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

Nope все еще не работает. Хорошая попытка. :) Я думал, что это могло бы сделать это после facepalm, но не пойти, его все еще null. Я также попытался изменить cust.selected на SelectListItem, и это тоже не сработало. –

+1

@ChristopherTownsend Изменить вспомогательное свойство '@ Html.DropDownListFor (model => model.selected.name, Model.членов ", --Select -") 'и создать объект в действии GET' new Customer() {name = "Cust1", selected = new Member()} ' – webdeveloper

-3

использование jQuery preend для устранения проблемы с легкостью.

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