2010-05-14 86 views
4

HTTP:www.site1.com/ SID = 555查詢字符串堅持整個網站的參數在ASP.Net MVC 2

我希望能夠有SID參數和值持續表單是否發佈或鏈接被點擊。

如果用戶導航到實現分頁的視圖,則查詢字符串中的其他參數應添加到sid後面。

HTTP:www.site1.com/ SID = 555 &頁= 3

我怎樣才能在Asp.Net MVC 2做到這一點?

[編輯]

我在上面提到的將是應用程序的入口點的URL,這樣的SID將被包含在鏈接。

在像應用程序鏈接:

<%= Html.ActionLink("Detail", "Detail", new { controller = "User", 
               id = item.UserId })%> 

應該去:
HTTP:www.site1.com/user/detail/3 SID = 555

這個問題是不是有什麼不同戴夫提到,因爲查詢字符串參數在整個站點中持續存在。

+0

可能重複[你如何在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

回答

1

可能重複:

How do you persist querystring values in asp.net mvc?

我接受的答案上面鏈接的問題達成一致。查詢字符串參數不是爲數據持久性設計的。如果設置(即sid = 555)旨在通過會話保留,請使用會話狀態或您的模型來保存該數據,以便跨請求使用。

3

首先,我想說如果值需要在整個會話中保持,那麼你應該將它存儲在會話中,並檢查它在每個動作調用中仍然有效。這可以通過添加到控制器/所需操作的自定義操作屬性完成。如果需要該值,則在檢查該值時,可以重新設置爲登錄頁面或類似(如果不存在或已過期)。

無論如何,這說我想我會得到它的工作裂縫。我的第一個想法是創建一個自定義操作篩選器屬性,它使用查詢字符串的值並將其存儲在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應用會議的生命。如果你想檢查值是否存在,並且每個請求都相同,你需要在屬性重寫方法中進行一些檢查。

最後

我已經做純粹這是一個「能不能做到」演習。我強烈建議不要這樣做。

相關問題