J'ai un ViewModel comme ceci:Comment transférer des données ViewModel entre des requêtes POST dans 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");
}
}
J'ai deux méthodes de contrôleur qui utilise ce modèle:
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
}
}
La première fois que l'utilisateur va à la vue Create
, ils sont présentés avec un liste des catégories. Cependant, s'ils échouent à la validation, la vue leur est renvoyée, sauf que cette fois la propriété Categories
est null. Cela est compréhensible car le ModelBinder
ne persiste pas Categories
s'il ne figurait pas dans la demande POST. Ma question est, quelle est la meilleure façon de garder Categories
persisté? Je peux faire quelque chose comme ceci:
[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
}
}
Mais c'est une solution laide. Comment puis-je le conserver? Je ne peux pas utiliser un champ caché parce que c'est une collection.
Donc, en d'autres termes, renseignez les listes manuellement? –
Que voulez-vous dire par manuellement? – Lorenzo
Oh whoops, je pensais que vous avez dit 'BaseController', pas' BaseModel'. –