2012-01-31 18 views
4

私は、部分的に3つのビューからなるビューを持っています 画面の左右の上部に2つの部分です。 それぞれが相互に排他的な検索を持っており、それぞれが戻って自分の行動に投稿同じビューの部分図を返す

これはこれは、部分図のいずれかのポストアクションがある

public ActionResult Index() { 
     var model = new SearchOptionsViewModel(); 
     return View(model); 
    } 

初期ビューをレンダリングするアクションは次のとおりです。

[HttpPost] 
    public ActionResult SearchByUser(UserSearchOptionsViewModel model) { 
     if(ModelState.IsValid) { 
      var list = SearchUserService.SearchByValue(model.LastName, model.Username, model.EmailAddress); 
      if(list != null) { 
       var resultsModel = new UserSearchResultsListViewModel(); 
       list.ForEach(item => resultsModel.Users.Add(new UserSearchResultsViewModel(item))); 
       return RedirectToAction("SearchResults", resultsModel); 
      } 
     } 
     return View(model); 
    } 

このモデルは、正常にデータを投稿してデータベースから取得し、それをviewmodelに追加します。 検索条件の下の同じ画面に結果を表示する方法については、私は迷っています。

これは、以前のアクションからモデルを受け取り、その部分を元のビューに戻すために働くことを望んでいたアクションです。私は3番目のSearchResultsのpartialviewを使って答えを出したが、それはうまくいかないと思った。それは同じページ上ではなく、結果を示す自分のページにナビゲートする。

public ActionResult SearchResults(UserSearchResultsListViewModel model) { 
     return PartialView(model); 
    } 

これを実行すると、モデルは常にnullになります。私はここに何か根本的な欠けている... このデータを同じビューに表示するにはどうすればいいですか?

答えて

1

これは私がやったことです。それは完全にきれいに感じることはありませんが、私は方法の責任を最小限に抑えてきました。私はあなたの例を投稿してください誰かがより良い提案を持っている場合、TempDataなしでこれを行うためのより良い方法を持っていると思います。

// Inital loaded view with 3 partial views 
    // 2 for search criteria, 1 for results 
    public ActionResult Index() { 
     var model = new SearchUsersViewModel(); 
     if(TempData["model"] != null) 
      model = (SearchUsersViewModel)TempData["model"]; 
     return View(model); 
    } 

    // Post the search criteria model for search 
    // by user data (by last name, etc...) 
    // Then redirect back to Index. 
    // TempData will have the full model with results populated 
    [HttpPost] 
    public ActionResult SearchByUser(FilterUsersByUserDataViewModel model) { 
     if(ModelState.IsValid) { 
      var list = SearchUserService.SearchByValue(model.LastName, 
                 model.Username, 
                 model.EmailAddress); 
      if(list != null) { 
       TempData["model"] = PrepareResultsModel(list); 
       return RedirectToAction("Index"); 
      } 
     } 
     return View(model); 
    } 

    // This method just separates the concern of creating 
    //the new full model with search results populating the results view 
    private SearchUsersViewModel PrepareResultsModel(List<SearchUserViewDTO> list) { 
     var searchResults = new UserSearchResultsViewModel(); 
     list.ForEach(item => searchResults.Users.Add(new UserViewModel(item))); 
     var model = new SearchUsersViewModel(); 
     model.UserSearchResultsViewModel = searchResults; 
     return model; 
    } 
+0

アクションはオブジェクトを渡すことができないため、プリミティブのみを処理する唯一の方法としてコンセンサスのようです。だからそれに印を付ける。 –

+0

しかし、2番目の方法でModelState.IsValidがfalseの場合はどうなりますか? –

+0

ModelStateはポストから最初のメソッドで評価されます。これは、別のストーリーであるdbにデータを保存していた場合、それは私にとって重要なことですが、これは単純にdbからデータを取得してモデルのプロパティに代入し、それは戻って –

関連する問題