2009-06-30 15 views
0

Ich gebe Daten zwischen meinem Controller und meiner View mit einer ViewModel-Klasse weiter. Wenn Validierungsfehler vorliegen, gebe ich das ViewModel zurück an die Ansicht, damit der Benutzer die Fehler sehen kann.So können Sie View-Only-Daten zwischen Views und Controllern hin- und herbewegen

Ich habe Probleme herauszufinden, die beste Art, mit den Daten umzugehen, die nur von der Steuerung an die Ansicht weitergegeben werden, die nicht an die Steuerung zurückgegeben wird, wie den Inhalt der Dropdown-Listen.

Hier ist ein vereinfachtes Beispiel aus dem Projekt arbeite ich an:

Ich habe ein Widget Objekt in meinem Domain-Modell, das eine Employee Eigenschaft hat. Ich habe eine Ansicht, mit der der Benutzer diese Mitarbeitereigenschaft bearbeiten kann, indem er seinen Namen aus einer Dropdown-Liste auswählt.

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; } 
} 

Und der Controller:

// 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)     
} 

Nun, hier ist das Problem: Wenn die ModelState ungültig ist und viewModel wird zu der Ansicht geführt zurück, seine EmployeeList Eigenschaft ist leer. Was ist der beste Weg, damit umzugehen?

Sollte ich es einfach neu füllen, bevor ich zur Ansicht zurückkehre? Diese Methode scheint schwer aufrechtzuerhalten. (Was passiert, wenn ich auch das Ansichtsmodell PageTitle und HeaderText hinzufüge? Plötzlich gibt es mehr Dinge zu verfolgen.) Gibt es einen anderen Ansatz?

Antwort

1

Innerhalb des catch-Blocks der Controller-Aktion, die den Post behandelt, extrahieren Sie Ihre Fehlermeldungen und fügen Sie sie zu this.ModelState hinzu, dann lassen Sie this.Edit (viewModel.widgetID) ;.

Sie verfügen bereits über die erforderliche Logik, um die Ansicht entsprechend anzuzeigen. Sie möchten ModelState nur verwenden, um sicherzustellen, dass Fehler zurück in die Ansicht gelangen.

Verwandte Themen