2012-01-31 67 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); 
    } 

該模型成功發佈並從數據庫獲取我的數據並將其添加到視圖模型。 我迷失了關​​於如何讓結果顯示在搜索條件下的同一屏幕上。

這是我希望能夠從先前操作中接收模型並將部分渲染回原始視圖的操作。我認爲使用第三個SearchResults partialview是答案,但這不起作用,它導航到它自己的頁面顯示結果,而不是在同一頁面上。

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

當我這樣做時,模型始終爲空。我在這裏錯過了一些基本的東西...... 如何獲取這些數據以顯示在同一個視圖上?

回答

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

看起來好像這是爲處理,只有這樣的共識,因爲該行爲不能傳遞對象,只有原語。所以標記它回答。 – 2012-02-01 18:50:40

+0

但是如果ModelState.IsValid在你的第二個方法中是假的呢? – 2012-05-14 08:16:00

+0

ModelState在帖子的第一個方法中被評估,這對我來說很重要,如果我將數據保存到db這是另一個故事,但是這只是從數據庫獲取數據並分配給模型的屬性併發送回來了 – 2012-05-14 12:12:44