问题 带有“文件扩展名”的ASP.NET MVC路由


我想为一个新闻列表制作一个MVC路线,可以以多种格式提供。

  • 新闻 - >(X)HTML
  • news.rss - > RSS
  • news.atom - > ATOM

是否可以通过一条路线执行此操作(在我计划的设计中,在一些地方出现更普遍的“可选扩展”情况)?或者我需要制作两条这样的路线:

routes.MapRoute("News-ImplicitFormat",
                "news",
                new { controller = "News", action = "Browse", format = "" });

routes.MapRoute("News-ExplicitFormat",
                "news.{format}"
                new { controller = "News", action = "Browse" });

似乎路由系统支持以下内容是有用的:

routes.MapRoute("News",
                "news(.{format})?",
                new { controller = "News", action = "Browse" });

1317
2017-11-01 18:04


起源



答案:


我做了一个支持添加如下对的方法,如下所示:

public static void MapRouteWithOptionalFormat(this RouteCollection routes,
                                              string name,
                                              string url,
                                              object defaults)
{
    Route implicitRoute = routes.MapRoute(name + "-ImplicitFormat",
                                          url,
                                          defaults);
    implicitRoute.Defaults.Add("format", string.Empty);

    Route explicitRoute = routes.MapRoute(name + "-ExplicitFormat",
                                          url + ".{format}",
                                          defaults);
}

12
2017-11-01 18:04



虽然我切换了隐式路由和显式路由的顺序,但由于显式更具可指定性,因此效果很好。 - ern


答案:


我做了一个支持添加如下对的方法,如下所示:

public static void MapRouteWithOptionalFormat(this RouteCollection routes,
                                              string name,
                                              string url,
                                              object defaults)
{
    Route implicitRoute = routes.MapRoute(name + "-ImplicitFormat",
                                          url,
                                          defaults);
    implicitRoute.Defaults.Add("format", string.Empty);

    Route explicitRoute = routes.MapRoute(name + "-ExplicitFormat",
                                          url + ".{format}",
                                          defaults);
}

12
2017-11-01 18:04



虽然我切换了隐式路由和显式路由的顺序,但由于显式更具可指定性,因此效果很好。 - ern


您可以考虑使用约束来使其适用于正常路由。

更新:实际上,我误解了这个问题。另一个答案是现在要做的正确的事情。或者创建自定义路线。我们正在考虑将可选段作为未来可能的功能。


0
2017-11-02 16:22



菲尔,我想要约束什么? 。载有( “”)?你能简要介绍一下这个策略吗?顺便说一句,很棒的工作。谢谢! - Doug McClean
Phil Haack在MVC问题上投降,我打赌这不会经常发生:) - fearofawhackplanet
我知道这已经有2到3年了,但现在这样做了吗?我想知道我能否拥有 /post/15 = html, /post/15.json = json api-data。 - Alxandr
哦,我希望他们根据结尾去不同的路线,这样我就可以拥有API控制器。 - Alxandr