2011-09-30 31 views
0

在過去的三天裏,我一直在努力尋找一種方法來完成我本應該是一件簡單的事情。單獨做這件事或在網上搜索解決方案並沒有幫助。也許是因爲當我做研究時,我甚至不知道要尋找什麼。 我會盡量在這裏解釋一下:也許有人能夠幫助我。如何通過控制操作更改單個查詢字符串參數?

我不會說我是怎麼做的,因爲我試圖用很多方式去做,而且他們都沒有爲不同的原因工作:我更喜歡看到你的新建議。

在大多數Web應用程序的網頁,我有兩個環節(但他們可能會更多)這樣的:

  • 選項A
  • 選項B

這是局部視圖,由管制員採取行動。

用戶可以選擇或同時選擇兩個(所有)值,但不能選擇任何值,這意味着至少必須選擇一個值。

這些鏈接幾乎可以在所有頁面中訪問,它們不應該重定向到不同的頁面,而只是將此信息存儲在某個地方,以便在操作需要過濾返回的內容時重用:始終可訪問的位置,關於當前控制器,操作或用戶(包括未經認證的用戶)(session?cookie?)。 此信息用於過濾整個Web應用程序中顯示的內容。

所以,問題不在於如何創建的,業務LOGI,但如何(在哪裏)存儲這些信息:

  • 不與查詢字符串搞亂(方法:保持查詢字符串爲空/儘可能乾淨)
  • 沒有重定向到其他網頁(用戶必須把當前頁面,只是內容不同)
  • 允許該信息的所有視圖之間仍然存在,直到用戶再次點擊更改的選項(S)

我的目標是將此信息存儲在將包含所有選項及其選擇狀態(開/關)的模型中,因此適用於PartialView的應用程序將知道如何顯示它們。 另外,我可以將此模型發送給將處理選項更改的「事物」。

謝謝。

UPDATE

繼保的建議下,我對這次談話方式:

private List<OptionSelectionModel> _userOptionPreferences; 
    protected List<OptionSelectionModel> UserOptionPreferences 
    { 
     get 
     { 
      if (Session["UserOptionPreferences"] == null) 
      { 
       _userOptionPreferences= Lib.Options.GetOptionSelectionModelList(); 
      } 
      else 
      { 
       _userOptionPreferences= Session["UserOptionPreferences"].ToString().Deserialize<List<OptionSelectionModel>>(); 
      } 

      if (_userOptionPreferences.Where(g => g.Selected).Count() == 0) 
      { 
       foreach (var userOptionPreferencesin _userOptionPreferences) 
       { 
        userOptionPreferences.Selected = true; 
       } 
      } 

      UserOptionPreferences= _userOptionPreferences; 
      return _userOptionPreferences; 
     } 
     private set 
     { 
      _userOptionPreferences= value; 
      Session["UserOptionPreferences"] = _userOptionPreferences.SerializeObject(); 
     } 
    } 

在此之後,我已經重寫(不知道是「覆蓋」正確的結合: )OnActionExecuting():

protected override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     GetOptionSelections(); 

     base.OnActionExecuting(filterContext); 
    } 

GetOptionSelections()...

private void GetOptionSelections() 
    { 
     if (String.IsNullOrEmpty(Request["optionCode"])) return; 

     var newOptionCode = Request["optionCode "]; 
     foreach (var userOptionPreferencesin UserOptionPreferences) 
     { 
      if (userOptionPreferences.OptionCode == newOptionCode) 
       userOptionPreferences.Selected = !userOptionPreferences.Selected; 
     } 
    } 

此代碼,我認爲可以更好,但現在我只想讓它工作,它沒有。

也許還有其他問題(很確定,實際上),但我認爲主要問題是OnActionExecuting由控制器中的每個操作調用,該控制器從BaseController繼承,因此它會持續切換userOptionPreferences.Selected開/關,但我不知道如何在每個View中只調用一次GetOptionSelections():像舊的Page_Load,但是對於MVC。

最後更新AKA解決方案 好吧,使用會話方式,我已經設法存儲這些信息。

另一個問題不是真的在這個問題上的主題,我已經設法解決它創建一個新的操作,照顧處理選項的變化,然後重定向到調用者URL(使用通常的returnUrl參數,但作爲動作參數)。 這樣,每個呼叫只能進行一次選項更改。

我不太喜歡的唯一的事情是我不能簡單地使用UserOptionPreferences屬性,因爲它不會改變會話值,但只是內存中的值,所以我必須設置屬性每次都有新對象的狀態:沒什麼大不了的,但也不好。

+0

我不確定代碼是什麼語言,但我再也忍不住了。我想你會得到更多的新問題的幫助,因爲這個問題被選爲答案。祝你好運! – Paul

+0

這是C#,對於這個問題感到抱歉:我將它標記爲錯誤地回答。 –

回答

1

這是一個使用會話的地方。

會話將在請求之間保持您的設置,同時保持它不在url查詢字符串中。看起來你可能已經嘗試過了,但是再試一次,如果你有問題再問一次。我認爲這將是解決這個問題的最佳方式。

相關問題