#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 целым числом с возможностью обнуления и украсить его требуемым атрибутом.