Je transmets des données entre mon contrôleur et ma vue à l'aide d'une classe ViewModel. Lorsqu'il y a des erreurs de validation, je renvoie le ViewModel à la vue afin que l'utilisateur puisse voir les erreurs. Je n'arrive pas à trouver la meilleure façon de traiter les données qui sont transmises du contrôleur à la vue, qui ne sont pas transmises au contrôleur, comme le contenu des listes déroulantes.Comment faire pour aller-retour des données en lecture seule entre les vues et les contrôleurs
Voici un exemple simplifié du projet, je travaille sur:
J'ai un objet Widget
dans mon modèle de domaine qui a une propriété Employee
. J'ai une vue qui permet à l'utilisateur de modifier cette propriété d'employé en sélectionnant son nom dans une liste déroulante.
public class WidgetFormViewModel {
// Used for a drop down list in the view
public SelectList EmployeeList { get; set; }
// This will contain the employee the user selected from the list
public int EmployeeID { get; set; }
public Widget Widget { get; set; }
}
Et le contrôleur:
// GET: /Widget/Edit/1
public ActionResult Edit(int id) {
var widget = _widgetService.GetWidgetByID(id);
var employees = _widgetService.GetAllEmployees();
var viewModel = new WidgetFormViewModel()
{
EmployeeList =
new SelectList(employees, "ID", "Name", widget.Employee),
Widget = widget,
WidgetID = widget.ID
};
return View("Edit", viewModel);
}
// POST: /Widget/Edit
public ActionResult Edit(WidgetFormViewModel viewModel) {
var existingWidget = _widgetService.GetWidgetByWidgetID(viewModel.WidgetID);
existingWidget.Employee = _widgetService.GetEmployeeByID(viewModel.EmployeeID);
// try { /* Save widget to DB */ } catch { /* Validation errors */ }
return ModelState.IsValid
// Update was successful
? (ActionResult) RedirectToAction("List")
// Model state is invalid, send the viewModel back to the view
: View("Edit", viewModel)
}
Maintenant, voici le problème: Quand le ModelState
est invalide et viewModel
est transmis revenir à la vue, sa EmployeeList
propriété est vide. Quelle est la meilleure façon de gérer cela?
Devrais-je le repeupler avant de revenir à la vue? Cette méthode semble difficile à maintenir. (Et si j'ajoute aussi PageTitle
et HeaderText
au modèle de vue? Soudain, il y a plus de choses à garder en mémoire.) Y a-t-il une autre approche?