如何通过控制操作更改单个查询字符串参数?

问题描述:

在过去的三天里,我一直在努力寻找一种方法来完成我本应该是一件简单的事情。单独做这件事或在网上搜索解决方案并没有帮助。也许是因为当我做研究时,我甚至不知道要寻找什么。 我会尽量在这里解释一下:也许有人能够帮助我。如何通过控制操作更改单个查询字符串参数?

我不会说我是怎么做的,因为我试图用很多方式去做,而且他们都没有为不同的原因工作:我更喜欢看到你的新建议。

在大多数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#,对于这个问题感到抱歉:我将它标记为错误地回答。 –

这是一个使用会话的地方。

会话将在请求之间保持您的设置,同时保持它不在url查询字符串中。看起来你可能已经尝试过了,但是再试一次,如果你有问题再问一次。我认为这将是解决这个问题的最佳方式。