Asp.net mvc MVC RouteLink是双重编码的
我在一个页面中定义了以下链接,该页面将基于web.config中定义的路由构建Asp.net mvc MVC RouteLink是双重编码的,asp.net-mvc,Asp.net Mvc,我在一个页面中定义了以下链接,该页面将基于web.config中定义的路由构建 <%= Html.RouteLink(product.DisplayName, "ShopProductNames", new {Id = product.Id, ProductName = product.DisplayName.Replace(' ', '-') }) %> 查看HtmlHelper.cs文件,第140行: internal static string GenerateUrl(str
<%= Html.RouteLink(product.DisplayName, "ShopProductNames", new {Id = product.Id, ProductName = product.DisplayName.Replace(' ', '-') }) %>
查看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)创建。使用,您将看到它在内部使用(System.Web.Routing.parsedulote.Bind方法)您是否尝试过ProductName=product.DisplayName.Replace(“”“-”)而不使用Url.Encode()。路由值在RouteLink()中编码,例如“”被编码为“%20”是的,我试过了,但它仍然没有编码。另外,我正在查看MVC源代码,我跟踪了所有RouteLink调用,从我所知,没有Url编码调用。Ryan,发布您的“ShopProductNames”路由。请将该路由添加到问题OK,如果是这样的话,那么当我停止使用Url.Encode(ProductName)时,应该使用空格和符号对它们进行编码,但这种情况肯定不会发生。
routes.MapRoute(
"ShopProductNames",
"Shop/{productName}/p/{id}/{*nameInfo}",
new
{
controller = "Product",
action = "Detail"
}
);
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;
}