0

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

我不会说我是怎么做的,因为我已经尝试了很多方法,但没有一个因不同的原因起作用:我更喜欢从你那里得到新的建议。

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

  • 选项 A
  • 选项 B

这是部分视图,由控制器操作返回。

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

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

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

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

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

谢谢。

更新

按照 Paul 的建议,我采用了 Session 方式:

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

获取选项选择()...

    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 开/关,但我没有'不知道如何让 GetOptionSelections() 在每个视图中只被调用一次:类似于旧的 Page_Load,但用于 MVC。

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

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

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

4

1 回答 1

1

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

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

于 2011-09-30T12:41:41.037 回答