我正在尝试用ASP.NET MVC做一些简单的事情:
RouteValuesDictionary routeValues = GetMyRouteData();
var url = new UrlHelper(Html.ViewContext.RequestContext);
return url.RouteUrl(routeValues);问题是,无论我做什么,url都包含来自当前请求上下文的路由数据。我只想根据来自GetMyRouteData()的路由值生成一个URL。
谢谢
发布于 2011-12-30 22:20:28
问题是,无论我做什么,url都包含来自当前请求上下文的路由数据。
这是设计好的。您必须显式设置原始请求中存在的路由值,并且您不希望结果url中的路由值为null:
var routeValues = GetMyRouteData();
// remove values that you want to exclude from the resulting url
// by setting their values to null
routeValues["id"] = null;
var url = new UrlHelper(Html.ViewContext.RequestContext);
return url.RouteUrl(routeValues);发布于 2013-03-13 03:44:33
这不是特定于ASP.NET MVC的,而是由于ASP.NET路由的路由解析。它的入口点是RouteCollection.GetVirtualPath,它有两个签名。
第一个参数是一个RequestContext和一个RouteValueDictionary。这用于默认路由解析,默认路由解析依赖于模式匹配来查找路由。路径搜索包含来自RequestContext和RouteValueDictionary的所有标记;换句话说,这两组路径标记组合在一起形成了路径搜索的基础。存在一种特殊情况,即RouteValueDictionary中的null参数将该参数从搜索中删除。但是,如果这样的空值参数在RequestContext中有值,则该值仍将作为查询字符串值出现在生成的URL值中。
另一个签名另外接受路由名称。这有点奇怪,因为它改变了路由解析和查询字符串的创建。显然,路由是使用名称解析找到的。如果找到指定的路由,则只有那些在路由的URL模式中指定的参数的令牌才会出现在生成的URL中。
为什么是这样呢?它是Ruby对ASP.NET on Rails的参数处理约定的解释。
因此,默认路由解析和“回退”令牌解析是有关系的。如果您不希望令牌回退到RequestContext,(并且您仍然希望使用ASP.NET路由),则必须使用命名路由解析。
发布于 2011-12-30 23:46:34
这可能有助于澄清。使用源码,卢克!
RouteUrl帮助器调用此静态方法来生成以下地址:
public static string GenerateUrl(string routeName, string actionName, string controllerName, RouteValueDictionary routeValues, RouteCollection routeCollection, RequestContext requestContext, bool includeImplicitMvcValues) {
if (routeCollection == null) {
throw new ArgumentNullException("routeCollection");
}
if (requestContext == null) {
throw new ArgumentNullException("requestContext");
}
RouteValueDictionary mergedRouteValues = RouteValuesHelpers.MergeRouteValues(actionName, controllerName, requestContext.RouteData.Values, routeValues, includeImplicitMvcValues);
VirtualPathData vpd = routeCollection.GetVirtualPathForArea(requestContext, routeName, mergedRouteValues);
if (vpd == null) {
return null;
}
string modifiedUrl = PathHelpers.GenerateClientUrl(requestContext.HttpContext, vpd.VirtualPath);
return modifiedUrl;
}请注意这一行:
RouteValueDictionary mergedRouteValues = RouteValuesHelpers.MergeRouteValues(actionName, controllerName, requestContext.RouteData.Values, routeValues, includeImplicitMvcValues);这是在幕后合并当前的requestcontext值。因此,您可以创建自己的帮助器,它只是调用此静态方法并传递空集合,以避免将当前路由上下文值合并到其中。在MVC代码中进行实验和调试,您应该能够看到需要nuke的值。
https://stackoverflow.com/questions/8680377
复制相似问题