首先,我想说如果值需要在整个会话中保持,那么你应该将它存储在会话中,并检查它在每个动作调用中仍然有效。这可以通过添加到控制器/所需操作的自定义操作属性完成。如果需要该值,则在检查该值时,可以重新设置为登录页面或类似(如果不存在或已过期)。
无论如何,这说我想我会得到它的工作裂缝。我的第一个想法是创建一个自定义操作筛选器属性,它使用查询字符串的值并将其存储在OnActionExecuting
的会话中,然后OnResultExecuted
会将该键添加回查询字符串。但是,由于Request中的QueryString是只读集合,因此不能直接进行。
那么,现在有什么可供您使用?
选项#1 - 将它添加到所有的呼叫,Html.ActionLink()手动
或...
选项#2 - 覆盖版本的ActionLink的自动加值为您服务。这可以像这样来实现。我不会推荐这样做。
从自定义属性开始。
public class PersistQueryStringAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var sid = filterContext.RequestContext.HttpContext.Request.QueryString["sid"];
if (!string.IsNullOrEmpty(sid))
{
filterContext.RequestContext.HttpContext.Session["sid"] = sid;
}
base.OnActionExecuting(filterContext);
}
}
所有这些都是检查所需密钥的请求查询字符串,以及是否将其添加到会话中。
然后你重写ActionLink的extention方法你自己的其中一个增加的价值。
public static class HtmlHelperExtensions
{
public static MvcHtmlString ActionLink<TModel>(this HtmlHelper<TModel> helper, string text, string action, string controller, object routeValues)
{
var routeValueDictionary = new RouteValueDictionary(routeValues);
if (helper.ViewContext.RequestContext.HttpContext.Session["sid"] != null)
{
routeValueDictionary.Add("sid", helper.ViewContext.RequestContext.HttpContext.Session["sid"]);
}
return helper.ActionLink(text, action, controller, routeValueDictionary, null);
}
}
在每一个将被称为应用属性的动作(或将其应用到控制器)如:
[PersistQueryString]
public ActionResult Index()
{
ViewData["Message"] = "Welcome to ASP.NET MVC!";
return View();
}
注意
由于查询值被放入会议将FO应用会议的生命。如果你想检查值是否存在,并且每个请求都相同,你需要在属性重写方法中进行一些检查。
最后
我已经做纯粹这是一个“能不能做到”演习。我强烈建议不要这样做。
可能重复[你如何在asp.net mvc中持续查询字符串值?](http://stackoverflow.com/questions/889732/how-do-you-persist-querystring-values-in-asp-net -mvc) – mathieu 2012-05-15 12:06:47