ASP.NET MVC - 将多个查询字符串参数映射到一个漂亮的URL

时间:2009-01-06 15:39:16

标签: asp.net-mvc seo query-string

我对mvc的seo友好网址的设计有点困惑....例如以下网址: http://myapp/venues/resturants.aspx?location=central&orderBy=top-rated

使用我的mvc应用程序,我将其映射如下: http://myapp/venues/list/resturants/central/top-rated
{控制器} / {行动} / {类别} / {位置} / {顺序}

现在唯一的问题是位置和订单是可选的......所以应该可以提交如下的请求:http://myapp/venues/list/resturants/top-rated。当请求到达控制器动作时,这被证明是一个问题,位置参数自然地获得了“最高评价”。

有什么建议吗?我正在考虑使用显式查询字符串来处理多个参数,但这确实是我的最后一个选项,因为我不想过多地牺牲SEO。

有没有人遇到过这种困境?你是怎么处理的?

提前致谢!

5 个答案:

答案 0 :(得分:14)

点击profile link,查看统计信息,近期信息,响应信息等网址。

示例:

没有排序,默认为stats

可选参数应为查询参数

答案 1 :(得分:2)

如果您有多个可选参数,则始终会遇到此问题。要么使其中一个或两个都是非可选的(并且在查询字符串中比可选的那个更早定位),或者使用querystring参数表示法。

答案 2 :(得分:2)

假设位置和顺序的允许值是唯一的(即当它们进入时,您可以将它们分开,或者如果它们只提供一个,您如何知道它是位置还是订单?) ,那么你可以拿两个参数来计算它们在控制器中的位置。

路线:{controller}/{action}/{param1}/{param2}

控制器操作:

public ActionResult MyAction(string param1, string param2)
{
    string location;
    string order;
    if (!ParseLocation(param1, out location))
    { ParseLocation(param2, out location); }
    // ...
}

不是特别优雅,但可以让您拥有所需的网址。

答案 3 :(得分:2)

好的家伙刚刚发布了我到目前为止一直在玩的解决方案。

我使用约束设置了我的路线,如下所示:

        routes.MapRoute(
            "VenuesList",                                              
            "venues/list/{category}/{location}/{orderBy}",             
            new { controller = "venues", action = "list", category = "", location = "", orderBy = "" },
            new { location = "central|east|west|south", orderBy = "top-rated|price" }
        );

    routes.MapRoute(
            "VenuesListByLocation",                                              
            "venues/list/{category}/{location}",                           
            new { controller = "venues", action = "list", category = "", location = "" },
            new { location = "central|east|west|south" }
        );

        routes.MapRoute(
            "VenuesListByOrder",                                              
            "venues/list/{category}/{orderBy}",                           
            new { controller = "venues", action = "list", category = "", orderBy = "" },
            new { orderBy = "top-rated|price" }
        );

        routes.MapRoute(
            "VenuesListDefault",                                              
            "venues/list/{category}",                           
            new { controller = "venues", action = "list", category = "" }

        );

        routes.MapRoute(
            "Default",                                              
            "{controller}/{action}/{id}",                           
            new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
        ); 

这个想法是,如果验证失败,它将转到列表中的下一个路径...最终达到默认值。

需要进行更多测试,但到目前为止效果还不错......

答案 4 :(得分:0)

为什么不在页面中为每个可能的查询字符串参数创建属性?

通过这种方式,您可以通过几行代码以任何方式处理它......