Model view controller 如何更改单个querystring参数(可能通过控制操作)?
在过去的三天里,我一直在努力寻找一种方法来完成我认为很简单的事情。我自己做这件事,或者在网络上搜索解决方案,都无济于事。也许是因为当我做研究时,我甚至不知道该找什么。 我会尽可能多地解释:也许有人能帮助我 我不会说我是怎么做的,因为我已经尝试了很多方法,但没有一种方法因为不同的原因起作用:我更愿意看到你的新建议 在web应用程序的大多数页面中,我有两个链接(但可能更多):Model view controller 如何更改单个querystring参数(可能通过控制操作)?,model-view-controller,object-persistence,Model View Controller,Object Persistence,在过去的三天里,我一直在努力寻找一种方法来完成我认为很简单的事情。我自己做这件事,或者在网络上搜索解决方案,都无济于事。也许是因为当我做研究时,我甚至不知道该找什么。 我会尽可能多地解释:也许有人能帮助我 我不会说我是怎么做的,因为我已经尝试了很多方法,但没有一种方法因为不同的原因起作用:我更愿意看到你的新建议 在web应用程序的大多数页面中,我有两个链接(但可能更多): 方案A 方案B 这是局部视图,由控制器操作返回 用户可以选择或同时选择两个(全部)值,但他们永远不能选择其中任何一个:这
- 方案A
- 方案B
- 不干扰查询字符串(意味着:尽可能保持查询字符串为空/干净)
- 无需重定向到其他页面(用户必须获取当前页面,仅包含不同的内容)
- 允许此信息在所有视图之间持续存在,直到用户再次单击以更改选项
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;
}
}