2009-06-30 7 views
0

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?

Répondre

1

À l'intérieur du bloc catch de l'action du contrôleur traitant le message, extrayez vos messages d'erreur et ajoutez-le à this.ModelState, puis demandez-lui de retourner this.Edit (viewModel.widgetID) ;.

Vous avez déjà toute la logique dont vous avez besoin pour afficher la vue de manière appropriée, vous voulez juste utiliser ModelState pour vous assurer que les erreurs le ramènent à la vue.

Questions connexes