首先,我想說如果值需要在整個會話中保持,那麼你應該將它存儲在會話中,並檢查它在每個動作調用中仍然有效。這可以通過添加到控制器/所需操作的自定義操作屬性完成。如果需要該值,則在檢查該值時,可以重新設置爲登錄頁面或類似(如果不存在或已過期)。
無論如何,這說我想我會得到它的工作裂縫。我的第一個想法是創建一個自定義操作篩選器屬性,它使用查詢字符串的值並將其存儲在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