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?