如何通过控制操作更改单个查询字符串参数?
在过去的三天里,我一直在努力寻找一种方法来完成我本应该是一件简单的事情。单独做这件事或在网上搜索解决方案并没有帮助。也许是因为当我做研究时,我甚至不知道要寻找什么。 我会尽量在这里解释一下:也许有人能够帮助我。如何通过控制操作更改单个查询字符串参数?
我不会说我是怎么做的,因为我试图用很多方式去做,而且他们都没有为不同的原因工作:我更喜欢看到你的新建议。
在大多数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属性,因为它不会改变会话值,但只是内存中的值,所以我必须设置属性每次都有新对象的状态:没什么大不了的,但也不好。
这是一个使用会话的地方。
会话将在请求之间保持您的设置,同时保持它不在url查询字符串中。看起来你可能已经尝试过了,但是再试一次,如果你有问题再问一次。我认为这将是解决这个问题的最佳方式。
我不确定代码是什么语言,但我再也忍不住了。我想你会得到更多的新问题的帮助,因为这个问题被选为答案。祝你好运! – Paul
这是C#,对于这个问题感到抱歉:我将它标记为错误地回答。 –