ASP.NET MVC - добавить значение GET к каждому URL ... ActionLink?Маршрутизация?Как? - PullRequest
2 голосов
/ 23 ноября 2010

Мне нужен элегантный способ добавления токена к каждому URL в приложении ASP.NET MVC. например:

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? Возможно, есть какое-то решение на основе маршрутизации?

Ответы [ 4 ]

3 голосов
/ 23 ноября 2010

Создайте пользовательский метод расширения TokenActionLink для HtmlHelper, внутри него получите текущее значение token из строки запроса и добавьте его в строку запроса ссылки.Вы можете иметь те же перегрузки, что и обычные 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);
}
3 голосов
/ 23 ноября 2010

Может быть более элегантное решение 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 голосов
/ 23 ноября 2010

Я бы предложил набор расширений 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 } ) %>
2 голосов
/ 23 ноября 2010

Вы можете добавить токен следующим образом.

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