2009-06-30 15 views
0

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プロパティが空白になっています。これに対処する最善の方法は何ですか?

ビューに戻る前に再投入すればよいですか?この方法は維持するのが難しいようです。 (PageTitleHeaderTextをビューモデルに追加するとどうなりますか?突然、さらに多くのことを把握する必要があります)。

答えて

1

投稿を処理するコントローラーアクションのcatchブロック内で、エラーメッセージを抽出してthis.ModelStateに追加し、this.Edit(viewModel.widgetID);を返します。

ビューを適切に表示するために必要なすべてのロジックが既に用意されていますが、ModelStateを使用してエラーがビューに戻っていることを確認してください。

関連する問題