代码之家  ›  专栏  ›  技术社区  ›  Brant Bobby

如何在视图和控制器之间仅查看往返数据

  •  0
  • Brant Bobby  · 技术社区  · 15 年前

    我正在使用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 到视图模型?突然之间有更多的事情需要跟踪。)还有其他方法吗?

    1 回复  |  直到 15 年前
        1
  •  1
  •   48klocs    15 年前

    在处理日志的控制器操作的catch块内,提取错误消息并将其添加到this.modelstate,然后让它返回this.edit(viewmodel.widgetid);。

    您已经建立了适当地显示视图所需的所有逻辑,您只需要使用ModelState来确保错误使其返回视图。