У меня есть ViewModel как так:Как передать данные ViewModel между запросами POST в ASP.NET MVC?
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
}
}
Но это уродливое решение. Как еще я могу это продолжать? Я не могу использовать скрытое поле, потому что это коллекция.
Иными словами, повторно заполнить списки вручную? –
Что вы подразумеваете под рукой? – Lorenzo
О, ооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооаеееееееееееееееее –