首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >仅从路径数据生成URL

仅从路径数据生成URL
EN

Stack Overflow用户
提问于 2011-12-30 22:17:10
回答 3查看 7.4K关注 0票数 6

我正在尝试用ASP.NET MVC做一些简单的事情:

代码语言:javascript
复制
RouteValuesDictionary routeValues = GetMyRouteData();
var url = new UrlHelper(Html.ViewContext.RequestContext);
return url.RouteUrl(routeValues);

问题是,无论我做什么,url都包含来自当前请求上下文的路由数据。我只想根据来自GetMyRouteData()的路由值生成一个URL。

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-12-30 22:20:28

问题是,无论我做什么,url都包含来自当前请求上下文的路由数据。

这是设计好的。您必须显式设置原始请求中存在的路由值,并且您不希望结果url中的路由值为null:

代码语言:javascript
复制
    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);
票数 9
EN

Stack Overflow用户

发布于 2013-03-13 03:44:33

这不是特定于ASP.NET MVC的,而是由于ASP.NET路由的路由解析。它的入口点是RouteCollection.GetVirtualPath,它有两个签名。

第一个参数是一个RequestContext和一个RouteValueDictionary。这用于默认路由解析,默认路由解析依赖于模式匹配来查找路由。路径搜索包含来自RequestContextRouteValueDictionary的所有标记;换句话说,这两组路径标记组合在一起形成了路径搜索的基础。存在一种特殊情况,即RouteValueDictionary中的null参数将该参数从搜索中删除。但是,如果这样的空值参数在RequestContext中有值,则该值仍将作为查询字符串值出现在生成的URL值中。

另一个签名另外接受路由名称。这有点奇怪,因为它改变了路由解析和查询字符串的创建。显然,路由是使用名称解析找到的。如果找到指定的路由,则只有那些在路由的URL模式中指定的参数的令牌才会出现在生成的URL中。

为什么是这样呢?它是Ruby对ASP.NET on Rails的参数处理约定的解释。

因此,默认路由解析和“回退”令牌解析是有关系的。如果您不希望令牌回退到RequestContext,(并且您仍然希望使用ASP.NET路由),则必须使用命名路由解析。

票数 2
EN

Stack Overflow用户

发布于 2011-12-30 23:46:34

这可能有助于澄清。使用源码,卢克!

RouteUrl帮助器调用此静态方法来生成以下地址:

代码语言:javascript
复制
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;
}

请注意这一行:

代码语言:javascript
复制
RouteValueDictionary mergedRouteValues = RouteValuesHelpers.MergeRouteValues(actionName, controllerName, requestContext.RouteData.Values, routeValues, includeImplicitMvcValues);

这是在幕后合并当前的requestcontext值。因此,您可以创建自己的帮助器,它只是调用此静态方法并传递空集合,以避免将当前路由上下文值合并到其中。在MVC代码中进行实验和调试,您应该能够看到需要nuke的值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8680377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档