У меня есть ViewModel, например, так:
public class ProductEditModel
{
public string Name { get; set; }
public int CategoryId { get; set; }
public SelectList Categories { get; set; }
public ProductEditModel()
{
var categories = Database.GetCategories(); // made-up method
Categories = new SelectList(categories, "Key", "Value");
}
}
Затем у меня есть два метода контроллера, которые используют эту модель:
public ActionResult Create()
{
var model = new ProductEditModel();
return View(model);
}
[HttpPost]
public ActionResult Create(ProductEditModel model)
{
if (ModelState.IsValid)
{
// convert the model to the actual entity
var product = Mapper.Map(model, new Product());
Database.Save(product);
return View("Success");
}
else
{
return View(model); // this is where it fails
}
}
Первый раз, когда пользователь переходит на Create
По их мнению, они представлены со списком категорий.Однако, если они не проходят проверку, им отправляется представление, за исключением того, что на этот раз свойство Categories
имеет значение null.Это понятно, потому что ModelBinder
не сохраняется Categories
, если его не было в запросе POST.Мой вопрос: каков наилучший способ сохранить Categories
сохраняющимся?Я могу сделать что-то вроде этого:
[HttpPost]
public ActionResult Create(ProductEditModel model)
{
if (ModelState.IsValid)
{
// convert the model to the actual entity
var product = Mapper.Map(model, new Product());
Database.Save(product);
return View("Success");
}
else
{
// manually populate Categories again if validation failed
model.Categories = new SelectList(categories, "Key", "Value");
return View(model); // this is where it fails
}
}
Но это уродливое решение.Как еще я могу сохранить это?Я не могу использовать скрытое поле, потому что это коллекция.