2010-11-23 12 views
2

私は、ASP.NET MVCアプリケーションの各URLにトークンを追加する洗練された方法の後です。例:ASP.NET MVC - すべてのURLにGET値を追加... 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

透明であるのappend..ation私はトークンのソースを使用するの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 }) %> 
+0

基本的にはすべて同じように答えている類似の回答がたくさんありますが、これは細心の注意を払うために受け入れられたものです。特に "(!values.ContainsKey(" token "))"となります。簡単なこと... – nathanchere

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

私は、目標は1が常にリンクを作成するコードにトークンを追加することを忘れないように持っていなかったように、それを自動化することだったと思います。 – tvanfosson

+0

@tvanfosson ...質問はそれほど具体的ではありませんでした。 OPが気づいていなかったActionLink Helperの詳細を提供しようとしていました。 –

3

その中にクエリ文字列から現在token値を取得し、リンクのクエリ文字列に追加し、HtmlHelperにカスタムTokenActionLink拡張メソッドを作成します。あなたは、通常のActionLinkと同じオーバーロードを持つことができ、tokenキーが

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); 
} 
関連する問題