ASP.NET MVC DropDownListFor возвращает значение null при обратном сообщении

Я хочу задать очень простой вопрос: я создаю простое приложение MVC для проверки функциональности раскрывающегося списка, в контроллере есть 2 метода действий: один для GET, а другой для POST. Я хочу получить выбранное значение из раскрывающегося списка, используя сообщение помощника формы HTML. Вот мои М, В и С;

Модель:

public class Programming
      {
           public int selectedId { get; set; }

            public List<SelectListItem> languanges;
      }

Контроллер:

public class HomeController : Controller
 {
   private Programming programming;
   private List<SelectListItem> list;

   public HomeController()
     {
        programming = new Programming();
        programming.languanges = new List<SelectListItem>();


        list = new List<SelectListItem>() {
        new SelectListItem(){ Value="1", Text="ActionScript"},
        new SelectListItem(){ Value="2", Text="AppleScript"},
        new SelectListItem(){ Value="3", Text="Asp"},
        new SelectListItem(){ Value="4", Text="BASIC"},
        new SelectListItem(){ Value="5", Text="C"},
        new SelectListItem(){ Value="6", Text="C++"},
        new SelectListItem(){ Value="7", Text="Clojure"},
        new SelectListItem(){ Value="8", Text="COBOL"},
        new SelectListItem(){ Value="9", Text="ColdFusion"},
        new SelectListItem(){ Value="10", Text="Erlang"},
        new SelectListItem(){ Value="11", Text="Fortran"},
        new SelectListItem(){ Value="12", Text="Groovy"},
        new SelectListItem(){ Value="13", Text="Haskell"}, 
        new SelectListItem(){ Value="14", Text="instinctcoder.com"},
        new SelectListItem(){ Value="15", Text="Java"},
        new SelectListItem(){ Value="16", Text="JavaScript"},
        new SelectListItem(){ Value="17", Text="Lisp"},
        new SelectListItem(){ Value="18", Text="Perl"},
        new SelectListItem(){ Value="19", Text="PHP"},
        new SelectListItem(){ Value="20", Text="Python"},
        new SelectListItem(){ Value="21", Text="Ruby"},
        new SelectListItem(){ Value="22", Text="Scala"},
        new SelectListItem(){ Value="23", Text="Scheme"},
        };
      }
        // GET: Home
        public ActionResult Index()
        {
            programming.languanges = list;

            return View(programming);
        }

        [HttpPost]
        public ActionResult Index(Programming programming)`enter code here`
        {
            return View();
        }

}

Вид:

        @model BSTNTest.Models.Programming

        @{
            ViewBag.Title = "Index";
          }

        @using (Html.BeginForm("Index", "Home", FormMethod.Post))
        {
            @Html.DropDownListFor(c => c.selectedId, Model.languanges)
            <button type="submit" class="btn btn-primary">Submit</button>
        }

Если я поставлю точку останова в действии публикации, я получу нуль языков! Почему это происходит?

И, наконец, получить нулевое исключение.

Спасибо


person Janshair Khan    schedule 14.09.2015    source источник
comment
Потому что вы не визуализируете ввод для каждого свойства каждого SelectListItem в коллекции (и не должны). Если вы хотите вернуть представление, потому что ModelState недействительно, вам нужно снова назначить SelectList   -  person    schedule 14.09.2015


Ответы (1)


Вы должны указать список не в методе Index, а там, где он создан, в конструкторе:

   public HomeController()
     {
        programming = new Programming();
        programming.languanges = new List<SelectListItem>();


        list = new List<SelectListItem>() {
        new SelectListItem(){ Value="1", Text="ActionScript"},
        new SelectListItem(){ Value="2", Text="AppleScript"},
        new SelectListItem(){ Value="3", Text="Asp"},
        new SelectListItem(){ Value="4", Text="BASIC"},
        new SelectListItem(){ Value="5", Text="C"},
        new SelectListItem(){ Value="6", Text="C++"},
        new SelectListItem(){ Value="7", Text="Clojure"},
        new SelectListItem(){ Value="8", Text="COBOL"},
        new SelectListItem(){ Value="9", Text="ColdFusion"},
        new SelectListItem(){ Value="10", Text="Erlang"},
        new SelectListItem(){ Value="11", Text="Fortran"},
        new SelectListItem(){ Value="12", Text="Groovy"},
        new SelectListItem(){ Value="13", Text="Haskell"}, 
        new SelectListItem(){ Value="14", Text="instinctcoder.com"},
        new SelectListItem(){ Value="15", Text="Java"},
        new SelectListItem(){ Value="16", Text="JavaScript"},
        new SelectListItem(){ Value="17", Text="Lisp"},
        new SelectListItem(){ Value="18", Text="Perl"},
        new SelectListItem(){ Value="19", Text="PHP"},
        new SelectListItem(){ Value="20", Text="Python"},
        new SelectListItem(){ Value="21", Text="Ruby"},
        new SelectListItem(){ Value="22", Text="Scala"},
        new SelectListItem(){ Value="23", Text="Scheme"},
        };
        programming.languanges = list;
      }

И будьте осторожны: у вас есть параметр метода post с тем же именем, что и ваша глобальная переменная, поэтому вы его скрываете. В методе Post вы должны вернуть представление с моделью, чтобы иметь список.

[HttpPost]
public ActionResult Index(Programming par)
{
    return View(programming);
}
person Maksim Simkin    schedule 14.09.2015