【问题标题】:ASP.NET MVC: Route to URLASP.NET MVC:路由到 URL
【发布时间】:2010-05-11 12:57:23
【问题描述】:

在 MVC 中获取路由的 URL(相对或绝对)最简单的方法是什么?我在 SO 上看到了这段代码,但它似乎有点冗长,并且没有枚举 RouteTable。

例子:

List<string> urlList = new List<string>();
urlList.Add(GetUrl(new { controller = "Help", action = "Edit" }));
urlList.Add(GetUrl(new { controller = "Help", action = "Create" }));
urlList.Add(GetUrl(new { controller = "About", action = "Company" }));
urlList.Add(GetUrl(new { controller = "About", action = "Management" }));

与:

protected string GetUrl(object routeValues)
{
    RouteValueDictionary values = new RouteValueDictionary(routeValues);
    RequestContext context = new RequestContext(HttpContext, RouteData);

    string url = RouteTable.Routes.GetVirtualPath(context, values).VirtualPath;

    return new Uri(Request.Url, url).AbsoluteUri;
}

检查 RouteTable 并获取给定控制器和操作的 URL 的更好方法是什么?

【问题讨论】:

标签: asp.net-mvc routes


【解决方案1】:

使用UrlHelper 类:http://msdn.microsoft.com/en-us/library/system.web.mvc.urlhelper.aspx

您应该可以通过控制器中的Url 对象来使用它。要映射到操作,请使用 Action 方法:Url.Action("actionName","controllerName");Action 方法的完整重载列表在这里:http://msdn.microsoft.com/en-us/library/system.web.mvc.urlhelper.action.aspx

所以你的代码看起来像这样:

        List<string> urlList = new List<string>();
        urlList.Add(Url.Action("Edit", "Help"));
        urlList.Add(Url.Action("Create", "Help"));
        urlList.Add(Url.Action("Company", "About"));
        urlList.Add(Url.Action("Management", "About"));

编辑:从您的新答案看来,您正在尝试构建站点地图。

看看这个 Codeplex 项目:http://mvcsitemap.codeplex.com/。我自己没用过,但看起来很结实。

【讨论】:

    【解决方案2】:

    怎么样(在控制器中):

        public IEnumerable<SiteMapEntry> SiteMapEntries
        {
            get
            {
                var entries = new List<SiteMapEntry>();
    
                foreach (var route in this.Routes)
                {
                    entries.Add(new SiteMapEntry
                    (
                        this.Url.RouteUrl(route.Defaults),
                        SiteMapEntry.ChangeFrequency.Weekly,
                        DateTime.Now,
                        1F));
                }
    
                return entries;
            }
        }
    

    控制器有成员的地方:

    public IEnumerable<Route> Routes
    

    注意:

    this.Url.RouteUrl(route.Defaults)
    

    【讨论】:

    • 顺便说一句。建议您实际编辑原始问题,而不是发布新答案(除非它是实际答案)
    • 太棒了!这就是我一直在寻找的。谢谢!
    猜你喜欢
    • 2010-11-22
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    相关资源
    最近更新 更多