在过去的三天里,我一直在努力寻找一种方法来完成我认为应该是一件简单的事情。我自己这样做或在网络上搜索解决方案都没有帮助。也许是因为当我进行研究时,我什至不确定要寻找什么。我会在这里尽可能多地解释:也许有人能帮助我。
我不会说我是怎么做的,因为我已经尝试了很多方法,但没有一个因不同的原因起作用:我更喜欢从你那里得到新的建议。
在 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 属性,因为它不会更改会话值,而只会更改内存中的值,所以我必须使用新对象的属性来设置属性每次状态:没什么大不了的,但也不是很好。