Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 如何在视图和控制器之间往返仅查看数据_Asp.net Mvc_Model View Controller_Validation - Fatal编程技术网

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

Asp.net mvc 如何在视图和控制器之间往返仅查看数据,asp.net-mvc,model-view-controller,validation,Asp.net Mvc,Model View Controller,Validation,我使用ViewModel类在控制器和视图之间传递数据。当出现验证错误时,我会将ViewModel返回到视图,以便用户可以看到错误 我很难找到处理仅从控制器传递到视图的数据的最佳方法,而这些数据没有传递回控制器,例如下拉列表的内容 下面是我正在进行的项目中的一个简化示例: 我的域模型中有一个小部件对象,它具有Employee属性。我有一个视图,允许用户通过从下拉列表中选择员工姓名来编辑此员工属性 public class WidgetFormViewModel { // Used for

我使用ViewModel类在控制器和视图之间传递数据。当出现验证错误时,我会将ViewModel返回到视图,以便用户可以看到错误

我很难找到处理仅从控制器传递到视图的数据的最佳方法,而这些数据没有传递回控制器,例如下拉列表的内容

下面是我正在进行的项目中的一个简化示例:

我的域模型中有一个
小部件
对象,它具有
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
添加到视图模型中会怎么样?突然有更多的东西需要跟踪。)还有其他方法吗?

在处理post的控制器操作的catch块内,提取错误消息并将其添加到此.ModelState,然后让它返回此。编辑(viewModel.widgetID)

您已经具备了适当显示视图所需的所有逻辑,您只需要使用ModelState来确保错误返回到视图