Model view controller 如何更改单个querystring参数(可能通过控制操作)?

Model view controller 如何更改单个querystring参数(可能通过控制操作)?,model-view-controller,object-persistence,Model View Controller,Object Persistence,在过去的三天里,我一直在努力寻找一种方法来完成我认为很简单的事情。我自己做这件事,或者在网络上搜索解决方案,都无济于事。也许是因为当我做研究时,我甚至不知道该找什么。 我会尽可能多地解释:也许有人能帮助我 我不会说我是怎么做的,因为我已经尝试了很多方法,但没有一种方法因为不同的原因起作用:我更愿意看到你的新建议 在web应用程序的大多数页面中,我有两个链接(但可能更多): 方案A 方案B 这是局部视图,由控制器操作返回 用户可以选择或同时选择两个(全部)值,但他们永远不能选择其中任何一个:这

在过去的三天里,我一直在努力寻找一种方法来完成我认为很简单的事情。我自己做这件事,或者在网络上搜索解决方案,都无济于事。也许是因为当我做研究时,我甚至不知道该找什么。 我会尽可能多地解释:也许有人能帮助我

我不会说我是怎么做的,因为我已经尝试了很多方法,但没有一种方法因为不同的原因起作用:我更愿意看到你的新建议

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

  • 方案A
  • 方案B
这是局部视图,由控制器操作返回

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

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

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

  • 不干扰查询字符串(意味着:尽可能保持查询字符串为空/干净)
  • 无需重定向到其他页面(用户必须获取当前页面,仅包含不同的内容)
  • 允许此信息在所有视图之间持续存在,直到用户再次单击以更改选项
我的目标是将这些信息存储在包含所有选项及其选择状态(开/关)的模型中,以便适当的PartialView知道如何显示它们。 此外,我还可以将此模型发送给将处理选项更改的“thing”

谢谢

更新

按照Paul的建议,我采取了以下方式:

    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();
        }
    }
GetOptionSelections()

我认为这段代码可以更好,但现在我只想让它工作,但它没有

可能还有其他问题(事实上相当肯定),但我认为主要问题是继承自BaseController的控制器中的每个操作都会调用OnActionExecuting,因此它会不断切换userOptionPreferences.Selected开/关,但我不知道如何使GetOptionSelections()生效在每个视图中只调用一次:类似于旧的页面加载,但对于MVC

上次更新AKA解决方案 好的,使用会话方式,我成功地存储了这些信息

另一个问题与这个问题的主题无关,我已经设法解决了它,创建了一个新的操作,负责处理选项的更改,然后重定向到调用方URL(使用常用的returnUrl参数,但作为操作参数)。 这样,每次调用仅进行一次选项更改


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

这是一个使用会话的地方


会话将在请求之间保留您的设置,同时将其排除在url查询字符串之外。您可能已经尝试过此设置,但请再试一次,如果您有问题,请再试一次。我认为这将是解决此问题的最佳方法。

我不确定该代码是什么语言,但我无法再提供帮助。我认为您将在新问题上获得更多帮助,因为此问题被选为已回答。祝您好运!这是C#并且对问题表示抱歉:我已将其标记为已错误回答。
    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        GetOptionSelections();

        base.OnActionExecuting(filterContext);
    }
    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;
        }
    }