MVC DropDownListFor Null Values

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

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

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>

Когда я выбираю что-то из списка выбора и нажимаю кнопку "Отправить", возвращается null:

nullselect

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

Ответ 1

Проблема, с которой вы работаете, заключается в том, что 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; }
}

Обновлено Управление списком раскрывающихся списков:

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

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

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

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

и/или

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

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

  return View();
}

Ответ 2

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

Ответ 3

используйте jQuery preend, чтобы устранить проблему с легкостью.

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