2010-11-23 54 views
2

我是在ASP.NET MVC應用程序中爲每個URL添加一個令牌的優雅方法。例如:ASP.NET MVC - 將GET值附加到每個URL ... ActionLink?路由?怎麼樣?

http://mysite.com/?token=81541858 

從任何特定的網頁,在生成的鏈接(例如,通過HTML.ActionLink)應該在現有令牌附加到新的URL。例如:

HTML.ActionLink("Show me","Detail",new{id=5}) 

應出示: http://mysite.com/Product/Detail/5?token=81541858

什麼是實現這一目標,同時與現有的整體設計保持最佳途徑。一個ActionLink包裝?也許有某種基於路由的解決方案?

回答

2

我建議一組使用源令牌的HtmlHelper擴展,並調用實際的HtmlHelper擴展,將該令牌添加到RouteValueDictionary。不過,您需要確保在視圖中使用擴展程序。

public static class HtmlHelperExtensions 
{ 

    public static string TokenActionLink(this HtmlHelper helper, string text, string action, object routeValues) 
    { 
      var token = GetToken(helper); 

      var values = new RouteValueDictionary(); 
      if (routeValues != null) 
      { 
       values = new RouteValueDictionary(routeValues); 
      } 
      if (!values.ContainsKey("token")) 
      { 
       values.Add("token", token); 
      } 

      return helper.ActionLink(action, values); 
    } 

    ... other custom helpers for different signatures... 

    private static string GetToken(HtmlHelper helper) 
    { 
     ...get token from session or request parameters... 
    } 
} 

用作:

<%= Html.TokenActionLink("action", new { id = 5 }) %> 
3

有可能是一個更優雅的MVC /路由解決方案,但一個簡單的擴展方法應該做的伎倆:

public static string TokenActionLink(this HtmlHelper html, 
            string linkText, 
            string actionName, 
            string controllerName, 
            int id, 
            int token) 
{ 
    var anchorFormat = "<a href=\"{0}\">{1}</a>"; 
    var urlFormat = "{0}/{1}/{2}?token={3}"; 
    return string.Format(anchorFormat, string.Format(urlFormat, controllerName, actionName, id, token.ToString()), linkText); 
} 

使用

<%: Html.TokenActionLink("Show Me", "Detail", "Product", Model.Id, Model.Token) %> 

或者,也許你可以創建一個自定義RouteValueDictionary:,並調用定製的ActionLink方法:

public static string TokenActionLink(this HtmlHelper html, 
             string linkText, 
             string actionName, 
             string controllerName, 
             int id, 
             int token) 
{ 
    var rvd = new RouteValueDictionary(ViewContext.RouteData.Values); 
    rvd["Token"] = token.ToString(); 
    return Html.ActionLink(linkText, actionName, controllerName, id, rvd); 
} 
2

您可以像這樣追加令牌。

HTML.ActionLink("Show me","Detail",new{id=5, token=myTokenVariable}) 
+3

我認爲目標是使它自動讓一個沒有記得要隨時添加標記的代碼創建鏈接。 – tvanfosson 2010-11-23 01:10:35

+0

@tvanfosson ...問題不是那麼具體。我只是試圖提供OP可能不知道的ActionLink Helper的細節。 – 2010-11-23 02:35:20

3

HtmlHelper定製TokenActionLink擴展方法,它裏面得到的查詢字符串當前token值,並將其追加到鏈接查詢字符串。你可以有相同的重載作爲正常ActionLinktoken關鍵的append..ation是透明

public static MvcHtmlString TokenActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, object routeValues) 
{ 
    var token = htmlHelper.ViewContext.RequestContext.HttpContext.Request.QueryString["token"]; 
    var routeValuesDict = new RouteValueDictionary(routeValues); 
    routeValuesDict["token"] = token; 
    return htmlHelper.ActionLink(linkText, actionName, routeValuesDict); 
}