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

时间:2011-09-30 11:18:18

标签: model-view-controller object-persistence

在过去的三天里,我一直在努力寻找一种方法来完成我认为应该是一件简单的事情。我自己这样做或在网上搜索解决方案没有帮助。也许是因为当我进行研究时,我甚至不确定要寻找什么。 我会尽可能多地解释一下:也许有人能够帮助我。

我不会说我是怎么做的,因为我试图以多种方式做到这一点而且没有一个因为不同的原因而工作:我更愿意看到你的新建议。

在Web应用程序的大多数页面中,我有两个链接(但它们可能更多):

  • 选项A
  • 选项B

这是部分视图,由控制器操作引发。

用户可以选择或同时选择(全部)值,但是他们不能永远不选择任何一个:意味着必须始终选择至少一个。

这些链接几乎可以在所有页面中访问,并且它们不应该重定向到不同的页面,而只是将这些信息存储在某个地方,以便在操作需要过滤返回的内容时重复使用:一个始终可访问的地方,关于当前控制器,操作或用户(包括未经过身份验证的用户)(会话?cookie?)。 此信息用于过滤整个Web应用程序中的显示内容。

因此,问题不在于如何创建该业务逻辑,而是如何(以及在​​何处)存储此信息:

  • 没有搞乱查询字符串(意思是:将查询字符串保持为空/干净)
  • 没有重定向到其他页面(用户必须获取当前页面,只有不同的内容)
  • 允许此信息在所有视图之间保留,直到用户再次单击以更改选项

我的目标是将此信息存储在一个模型中,该模型将包含所有选项及其选择状态(开/关),因此适当的PartialView将知道如何显示它们。 此外,我可以将此模型发送到将处理选项更改的“事物”。

感谢。

更新

按照保罗的建议,我采用了会议方式:

    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 on / off,但是我不知道如何在每个View中只调用一次GetOptionSelections():类似于旧的Page_Load,但是对于MVC。

上次更新AKA解决方案 好的,使用会话方式,我已经设法存储了这些信息。

另一个问题并不是关于这个问题的主题,我设法解决它创建一个新的操作,负责处理选项的更改,然后重定向到调用者URL(使用通常的returnUrl参数,但作为动作参数)。 这样,每次调用只进行一次选项更改。

我唯一不喜欢的是我不能简单地使用UserOptionPreferences属性,因为它不会更改会话值,而只会更改内存中的值,所以我必须设置属性每次新对象的状态:不是很大,但也不好。

1 个答案:

答案 0 :(得分:1)

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

会话将在请求之间保持您的设置,同时将其保持在url querystring之外。看来你可能已经尝试了这个,但是再试一次,如果你有问题再问一遍。我认为这将是解决这个问题的最佳方式。