2010-01-04 134 views
7

我前段時間已經構建了一個ASP.NET MVC應用程序,經過幾個維護週期後,我想知道是否採取了最佳的狀態管理方法。一切正常,但我覺得有更好的辦法。ASP.NET MVC中的狀態管理

該網站基於具有不少選項的搜索功能。用戶通過填寫​​表單中的多個搜索選項並單擊「搜索」按鈕來開始使用該網站。此按鈕職位的搜索方法與所有的搜索選項定義爲參數的搜索方法,例如:

public ActionResult Search(string param1, string param2, string param3, int? param3, long? param4) 

現在的結果頁面,顯示了有一些關於它的鏈接,導致各種詳細信息頁面等。由於我所需要的搜索狀態的詳細信息頁面上被保留了,我發現自己創建ActionLinks有很多的參數,所有的地方,如:

<%=Html.ActionLink("LinkText", "MethodName", new {id="idOfDetailPage", param1=Model.param1, param2=Model.param2, param3=Model.param3, param4=Model.param4}, null)%> 

在各個環節大多數參數值的做不是從搜索的當前狀態改變,但我需要傳遞它們以便能夠在具有c的詳細頁面中創建其他鏈接urrent搜索參數,例如「返回搜索結果」。

當我需要添加一個搜索參數由於新的功能要求,我發現自己修改了很多鏈接以及任何鏈接導致的控制器方法。這是我覺得我需要更好的方式。

我曾考慮過使用會話狀態來保持搜索參數,但由於某種原因,認爲這不是在ASP MVC中使用的最佳方式,所以我很好奇是否有另一種更簡潔的方法來實現這一點。

注意:我也嘗試過在ActionLink中使用強類型對象的方法,但我仍然需要將參數傳遞給該對象,所以效果不會好得多。

任何想法表示讚賞。

回答

1

對這類事情使用會話狀態總是令人討厭,因爲這意味着這些頁面不能被加入書籤,如果你想打開多個標籤,它開始變得混亂。

您可以創建一個新的SearchParameters類:

public class SearchParameters 
{ 
    public string Param1 { get; set; } 
    public string Param2 { get; set; } 
} 

修改你的動作要

public ActionResult Search(SearchParameters params) 

,然後通過視圖數據這回視圖。

那麼您認爲應該可以。如果你想利用這個所有的地方使用

<%=Html.ActionLink("LinkText", "MethodName", Model) %> 

,你可能想創建一個擴展的HtmlHelper:

public static class SearchExtensions 
{ 
    public static string SearchLink<TModel>(this HtmlHelper<TModel> helper, string linkText) 
     where TModel : SearchModel, class //required by ASP.NET MVC 
    { 
     return helper.ActionLink(linkText, "MethodName", modelType.ViewData.Model) %> 
    }  
} 

,然後搜索就像這樣簡單:

<%=Html.SearchLink("LinkText") %> 
+0

只要我總是將相同的搜索參數和搜索參數傳遞給動作如搜索動作。然而,當我需要將其他數據傳遞給該操作時,例如某個項目的標識(如細節頁面),我會遇到麻煩。然後,我不能簡單地將模型傳遞給Html.ActionLink輔助方法。此外,許多鏈接需要更改其中一個搜索參數,其餘部分保持不變,所以使用這種方法我需要不斷創建新的SearchParameters對象。它的作品,但一段時間後它變得混亂。 – 2010-01-04 17:27:37

+3

我要堅持我的想法,並建議書籤搜索並不總是一件好事情 - 它取決於上下文和應用程序 - 尤其是如果搜索具有未公開的依賴關係在參數中。這就是說我認爲這是一個很好的概括( - : – Murph 2010-01-04 18:24:27