基于多个参数的好网址

时间:2010-07-07 09:24:08

标签: asp.net-mvc url-routing friendly-url

很清楚在你的网站上使用漂亮网址的优点是什么。

让我用一个例子来澄清我在问什么。要注意,此处的实体不能通过名称进行单点识别。

假设用户想要查看您站点上注册的所有在特定位置可用的无线电台。这是通过访问网址来完成的: http://example.com/radios/1234/radio-paris-eiffel-tower

  • 1234 - 在这种情况下是位置的唯一ID
  • radio-paris-eiffel-tower - 只是让网址变得更好的其他信息。

如果用户想要查看特定无线电台可访问的所有位置,他们可以使用: http://example.com/locations/abcd/radio-xyz

  • abcd - 此处标识收音机

现在的问题是:在特定位置(如姓名,频率等)访问特定广播电台的广播电台详细信息会有什么好处?

http://example.com/radio/1234/radio-paris-eiffel-tower/abcd/radio-xyz 要么 http://example.com/radio/details?radioid=1234&locationid=abcd/radio-xyz-at-paris-eiffel-tower

您有什么建议吗?请您举例说明如何为您建议的网址编写路线?

非常感谢。

PS : 实际上考虑上面的网址,而不是 http://example.com/radios/1234/radio-paris-eiffel-tower

它会更好 http://example.com/1234/radio-paris-eiffel-tower/radios/

wdyt?

我怎么能将这样的路由映射到RadiosController.ListByLocation(int locationId)?

1 个答案:

答案 0 :(得分:3)

以下是使用自定义路线的建议。我在Global.asax.cs文件中设置了它:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        "Radio and Frequency Route", // Route name
        "radio/details/{radioId}/{locationId}/{someUnusedName}", // URL with parameters
        new
        {
            controller = "Some",
            action = "SomeAction",
            radioId = string.Empty,
            locationId = string.Empty
        }
    );

    routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
    );

}

控制器非常简单:

public class SomeController : Controller
{
    public ActionResult SomeAction(string radioId, string locationId)
    {
        ViewData["radioId"] = radioId;
        ViewData["locationId"] = locationId;

        return View();
    }

}

它响应以/ radio / details为前缀的URL:

http://localhost:51149/radio/details/123/456/moo
http://localhost:51149/radio/details/abc/xyz/foo

现在,您可以构建任何适合您需求的友好URL。也许您想将/ radio / details前缀更改为其他内容?