ViewModelクラスを使用して、コントローラとビューの間でデータを渡しています。検証エラーがある場合、ViewModelをビューに戻して、ユーザーがエラーを確認できるようにします。ビューとコントローラ間でビューのみのデータをラウンドトリップする方法
コントローラからビューに渡されるデータのみを処理するための最良の方法を理解することができません。このデータは、ドロップダウンリストの内容など、コントローラに返されません。私はEmployee
性質を持っている私のドメインモデルでWidget
オブジェクトを持って
:ここ
は、私が働いているプロジェクトからの簡単な例です。私は、ユーザーがこの従業員のプロパティをドロップダウンリストから選択して編集できるビューを持っています。
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
をビューモデルに追加するとどうなりますか?突然、さらに多くのことを把握する必要があります)。