我使用ViewModel类在我的控制器和视图之间传递数据。当存在验证错误时,我将ViewModel返回到视图,以便用户可以看到错误。
我无法找出处理仅从控制器传递到视图的数据的最佳方法,而这些数据不会传递回控制器,例如下拉列表的内容。
以下是我正在处理的项目的简化示例:
我的域模型中有一个Widget
对象,它具有Employee
属性。我有一个视图,允许用户通过从下拉列表中选择他们的名称来编辑该员工属性。
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; }
}
控制器:
// 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)
}
现在,问题出现了:当ModelState
无效并且viewModel
被传递回视图时,其EmployeeList
属性为空。处理这个问题的最佳方法是什么?
我应该在返回视图之前重新填充它吗?这种方法似乎很难维护。 (如果我将PageTitle
和HeaderText
添加到视图模型中会怎样?突然有更多的事情需要跟踪。)还有其他方法吗?
答案 0 :(得分:1)
在处理帖子的控制器动作的catch块内部,提取你的错误消息并将其添加到this.ModelState,然后让它返回this.Edit(viewModel.widgetID);.
您已经拥有了构建适当显示视图所需的所有逻辑,您只需要使用ModelState来确保错误使其返回到视图。