我正在采用一种优雅的方式将标记附加到ASP.NET MVC应用程序中的每个URL。例如:
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包装器?也许有某种基于路由的解决方案?
答案 0 :(得分: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);
}
答案 1 :(得分:3)
在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);
}
答案 2 :(得分:2)
您可以像这样添加令牌。
HTML.ActionLink("Show me","Detail",new{id=5, token=myTokenVariable})
答案 3 :(得分: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 } ) %>