Выпадающий список, почему он получает ключ и ничего больше

#asp.net-mvc-3 #drop-down-menu

#asp.net-mvc-3 #выпадающее меню

Вопрос:

У меня есть свойство в моей модели, очень простое:

введите описание изображения здесь

Теперь этот выпадающий список работает неправильно

 @Html.DropDownListFor(m => m.Camp, new SelectList(ViewBag.Camps, "Id", "Name"))
  

он возвращает null вместо выбранного лагеря, но если я изменю это на:

 @Html.DropDownListFor(m => m.Camp.Id, new SelectList(ViewBag.Camps, "Id", "Name"))
  

Это вернуло бы мне Camp объект с правильным Id значением, но Name было бы по-прежнему null .

Почему?

UPD:

И теперь другая проблема заключается в том, что если я выберу второй подход, это приведет к сбою с ненавязчивой проверкой. Хотя я смогу получить правильный лагерь на основе выбранного идентификатора.

Комментарии:

1. Можете ли вы опубликовать код в своем контроллере, где вы заполняете ViewBag. Лагеря?

Ответ №1:

Это нормально. В действие контроллера передается только Id . Вот как работает выпадающий список внутри форм. Итак, это все, чего вы можете надеяться достичь. Затем вы будете использовать это Id для получения соответствующего объекта Camp из базы данных:

 [HttpPost]
public ActionResult Foo([Bind(Prefix = "Camp")]int id)
{
    Camp camp = Repository.GetCamp(id);
    ...
}
  

Также, пожалуйста, избавьтесь от этого ViewBag и используйте модель реального представления:

 public class CampViewModel
{
    public int Id { get; set; }
    public IEnumerable<SelectListItem> Camps { get; set; }
}
  

и в контроллере:

 public ActionResult Index()
{
    var model = new CampViewModel
    {
        Camps = Repository.GetCamps().Select(x => new SelectListItem
        {
            Value = x.Id.ToString(),
            Text = x.Name
        })
    };
    return View(model);
}

[HttpPost]
public ActionResult Index(int id)
{
    Camp camp = Repository.GetCamp(id);
    ...
}
  

и представление:

 @model CampViewModel
@using (Html.BeginForm())
{
    @Html.DropDownListFor(
        x => x.Id,
        new SelectList(Model.Camps, "Value", "Text")
    )
    <input type="submit" value="OK" />
}
  

Комментарии:

1. Дело в том, что в контроллере он возвращает ModelState недействительным даже после того, как я нашел лагерь на основе заданного идентификатора и присвоил этот объект лагеря модели.

2. Я добавил ModelState. Удалить(«Camp.Name «) к контроллеру

3. Ненавязчивая проверка не работает. Он не украшается атрибутом data-val-required.

4. @Agzam, попробуйте сделать свойство Id CampViewModel целым числом с возможностью обнуления и украсить его требуемым атрибутом.