2010-11-23 4 views
2

Je suis après une façon élégante d'ajouter un jeton à chaque URL dans une application ASP.NET MVC. par exemple:ASP.NET MVC - Ajout de la valeur GET à chaque URL ... ActionLink? Routage? Comment?

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

partir d'une page donnée, quand un lien est généré (par exemple par le biais Html.ActionLink) il doit ajouter le jeton existant à la nouvelle URL. par exemple:

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

devrait produire: http://mysite.com/Product/Detail/5?token=81541858

Quelle serait la meilleure façon d'atteindre cet objectif tout en maintenant la conception globale existante. Un wrapper ActionLink? Peut-être y a-t-il une solution de routage?

Répondre

2

Je suggère un ensemble d'extensions de HtmlHelper qui utilisent la source pour le jeton et appelez la HtmlHelper réelle extensions, en ajoutant le jeton au RouteValueDictionary. Toutefois, vous devrez vous assurer d'utiliser vos extensions dans vos vues.

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... 
    } 
} 

Utilisé comme:

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

Un grand nombre de réponses similaires qui tous fondamentalement répondu la même chose, mais c'est le accepté pour l'attention aux détails. Surtout "(! Values.ContainsKey (" token "))". Des choses simples... – nathanchere

3

Il peut y avoir une plus élégante solution MVC/de routage, mais une méthode simple d'extension devrait faire l'affaire:

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); 
} 

Utilisation:

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

Ou vous pourriez peut-être créer une coutume RouteValueDictionary:, et appelez dans la méthode ActionLink de votre méthode personnalisée:

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

Vous pouvez ajouter le jeton de la manière suivante.

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

Je pense que l'objectif était de rendre automatique, de sorte que l'on n'a pas à se rappeler de toujours ajouter le jeton dans le code créant le lien. – tvanfosson

+0

@tvanfosson ... La question n'était pas si précise. J'essayais simplement de fournir des détails à l'aide ActionLink que OP ne connaissait peut-être pas. –

3

Faire une méthode d'extension personnalisée TokenActionLink sur HtmlHelper, à l'intérieur de celui-ci obtenir la valeur token actuelle du querystring et l'ajouter au lien querystring. Vous pouvez avoir les mêmes que la ActionLink surcharge normale et la append..ation de la clé token est transparent

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); 
}