在過去的三天裏,我一直在努力尋找一種方法來完成我本應該是一件簡單的事情。單獨做這件事或在網上搜索解決方案並沒有幫助。也許是因爲當我做研究時,我甚至不知道要尋找什麼。 我會盡量在這裏解釋一下:也許有人能夠幫助我。如何通過控制操作更改單個查詢字符串參數?
我不會說我是怎麼做的,因爲我試圖用很多方式去做,而且他們都沒有爲不同的原因工作:我更喜歡看到你的新建議。
在大多數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屬性,因爲它不會改變會話值,但只是內存中的值,所以我必須設置屬性每次都有新對象的狀態:沒什麼大不了的,但也不好。
我不確定代碼是什麼語言,但我再也忍不住了。我想你會得到更多的新問題的幫助,因爲這個問題被選爲答案。祝你好運! – Paul
這是C#,對於這個問題感到抱歉:我將它標記爲錯誤地回答。 –