2010-10-18 78 views
0

我有一個基於以下情形幾個問題:跨控制器傳遞視圖模型(含請求參數)

我有以下方法的LoginController:

public ActionResult Login() 
{ 
    return View(); 
} 

[HttpPost] 
public ActionResult Login(UserObject user) 
{ 

    Calling Besiness Service to Validate User againts DB (Using Repository)... 

    if (success) 
    { 
     return RedirectToAction("Search", "Search"); 
    } 
    else 
    { 
     ModelState.AddModelError("", "The user name or password provided is incorrect."); 
    } 
    return View(user); 
} 

登錄成功後,我要提出一個搜索屏幕。我有以下方法SearchController:

public ActionResult Search() 
{ 
    return View(); // This returns a EMPTY Search Form. 

} 

[HttpPost] 
public ActionResult Search(SearchView search) 
{ 
    // Validate Search parameters... 
    // I have to perform a search by calling Business Service and present results. I would like to use a seperate controller (PricingController) for this task. 
    return RedirectToAction("Index", "Pricing"); // Not sure if this is the correct way? 
} 

現在我想有一個PricingController將採取「搜索查看」視圖模型包含我的搜索參數,並調用業務服務,以獲得定價結果,並將其呈現給用戶。

這是一個正確的方法嗎?如何將包含我的搜索參數的「SearchView」ViewModel從SearchController傳遞給PricingController?我需要在整個應用程序中訪問(數據)「SearchView」ViewModel,因爲用戶可以根據初始搜索條件添加可選項目,並且可以根據需要修改此搜索條件。我應該將「SearchView」ViewModel存儲在緩存中嗎?我將在Web Farm中部署我的應用程序,並且不想使用Http Session。我將使用Cookies來管理用戶會話。

回答

0

對模型傳遞到另一個動作,你可以這樣做:

[HttpPost] 
public ActionResult Search(SearchView search) 
{ 
    return RedirectToAction("Index", "Pricing", new { exactNameOfSearchViewParameter = search }); 
} 
+0

謝謝Joakim。我知道我可以這樣做,但這是一種正確的方法嗎?還是有更好的方法來做到這一點? – Alex 2010-10-18 18:05:44

+0

據我所知,如果你想基於另一個視圖返回一個視圖,那麼這就是要走的路,然而我會直接在動作搜索中使用包含搜索方法的服務,並從那裏呈現視圖。 – Joakim 2010-10-18 18:27:57

+0

再次感謝。關於您的第二種方法,我可以在「搜索(SearchView搜索)」方法中調用定價服務並填充PricingView View模型,但是如何呈現View?如果我調用「返回視圖(模型)」,那麼它不會改變我的瀏覽器中的URL,並在瀏覽器上重新加載/刷新將是一個問題...如果我調用「RedirectToAction()」方法,那麼我在我的視圖模型。我希望我有道理? – Alex 2010-10-18 19:28:13

0

你可以有一個定價庫與價格的計算交易。現在將這個資源庫注入每個需要計算價格並在操作中使用它的控制器。這樣你就不需要任何重定向,在需要使用價格的每個操作中,只需在存儲庫中調用適當的方法即可。

+0

謝謝Darin。它實際上是包含我在多個(70%)控制器中需要的搜索參數的「SearchView」ViewModel,以及我的核心組件,附加件,中間件等的定價結果將基於最初的搜索條件。你會建議將這些信息注入我的控制器嗎?如果是這樣,注入此信息的最佳方式是什麼? – Alex 2010-10-18 20:59:21

+0

你可以編寫一個自定義的控制器工廠和[注入依賴到你的控制器](http://weblogs.asp.net/shijuvarghese/archive/2009/03/12/applying-dependency-injection-in-asp-net-mvc -nerddinner-COM-application.aspx)。 – 2010-10-18 21:02:30

0

在這種情況下,我想我會將Search操作方法移動到PricingController。它似乎真的屬於那裏,因爲你正在做一個價格相關的搜索。

然後你不必擔心如何在控制器之間傳輸數據。

您可以修改您的觀點後,直接出現:

<% Html.BeginForm("search", "pricing"); %> 
... 
<% Html.EndForm() %> 

如果你真的需要通過控制器或動作之間的數據,你可以使用TempData。只要確保您的控制器/操作/視圖在TempData爲空時仍然有效。

0

亞歷克斯,所有我會停止去想它作爲視圖模型的

第一。 ViewModel完全是關於視圖,與視圖本身密切相關。你在談論的是數據(在整個應用程序中使用的一組標準)。所以這個問題可能不是關於傳遞ViewModel,而是關於傳遞數據和保存/共享狀態(選定的標準)。

您可以擁有某種SearchCriteriaData DTO類,並在您的應用程序的任何需要的地方將其用於不同的ViewModels中。 SearchViewModel本身可能只有SearchCriteriaData的唯一參數。總監不應該爲保持國家一致性而煩惱,它只是不負責任。它可以刷新它(使用一些服務調用,例如SearchService)並且忘記並且永遠不會考慮誰將使用它。

然後控制器需要使用這種搜索條件,不僅僅依賴給定的查詢字符串參數,還從SearchService中提取這些條件(它給了我們實際的SearchCriteriaData)並將它附加到它自己特定的ViewModel中。因此,您不必擔心控制器級別的狀態並將其控制在其他位置(如果需要,SearchService甚至可以將這些條件保存在數據庫中)。

因此,讓你的控制器應該是無狀態的,並用查詢字符串參數或SearchService控制狀態(從當前位置提取當前用戶定義的搜索條件)。

相關問題