我在页面中定义了以下链接,该页面将根据web.config中定义的路由构建
<%= Html.RouteLink(product.DisplayName, "ShopProductNames", new {Id = product.Id, ProductName = product.DisplayName.Replace(' ', '-') }) %>
我需要对该链接的URL中的DisplayName进行URL编码,但是,当我按以下方式添加编码时:
<%= Html.RouteLink(product.DisplayName, "ShopProductNames", new {Id = product.Id, ProductName = Url.Encode(product.DisplayName.Replace(' ', '-')) }) %>
它重新编码我的DisplayName(在URL中),我在IIS中收到错误。
我的DisplayName属性在传递给页面之前未进行编码。此外,默认情况下,RouteLink似乎不是渲染链接的Url编码,因为在渲染页面时它不会拾取空格或“&”符号。
任何人都知道我做错了什么?
更新:我实际上指的是RouteLink生成的URL,而不是链接文本本身
更新2:这是我正在使用的路线
routes.MapRoute(
"ShopProductNames",
"Shop/{productName}/p/{id}/{*nameInfo}",
new
{
controller = "Product",
action = "Detail"
}
);
答案 0 :(得分:1)
查看HtmlHelper.cs文件,第140行:
internal static string GenerateUrl(string routeName, string actionName, string controllerName, RouteValueDictionary routeValues, RouteCollection routeCollection, RequestContext requestContext, bool includeImplicitMvcValues)
{
RouteValueDictionary mergedRouteValues = RouteValuesHelpers.MergeRouteValues(actionName, controllerName, requestContext.RouteData.Values, routeValues, includeImplicitMvcValues);
VirtualPathData vpd = routeCollection.GetVirtualPath(requestContext, routeName, mergedRouteValues);
if (vpd == null) {
return null;
}
string modifiedUrl = PathHelpers.GenerateClientUrl(requestContext.HttpContext, vpd.VirtualPath);
return modifiedUrl;
}
Url由routeCollection.GetVirtualPath()方法(System.Web.Routing.dll)创建。使用Reflector,您会看到它在内部使用Uri.EscapeDataString()(System.Web.Routing.ParsedRoute.Bind方法)