7

我对 mvc 的 seo 友好 url 的设计有点卡住了……以以下 url 为例: http://myapp/venues/resturants.aspx?location=central&orderBy=top-rated

使用我的 mvc 应用程序,我将其映射如下: http://myapp/venues/list/resturants/central/top-rated
{controller}/{action}/{category}/{location}/{order}

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

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

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

提前致谢!

4

5 回答 5

14

单击您的个人资料链接并查看 Stats、Recent、Response 等的 URL。

例子:

没有排序它默认为 stats

可选参数应该是查询参数

于 2009-01-06T16:18:23.943 回答
2

如果您有多个可选参数,您将始终遇到此问题。要么将它们中的一个或两个设为非可选(并且在查询字符串中的位置比可选的更早),要么使用查询字符串参数表示法。

于 2009-01-06T15:51:55.010 回答
2

假设 location 和 order 的允许值是唯一的(即当它们进入时,您可以将它们区分开来,或者如果它们只提供一个,您如何知道它是 location 还是 order?),那么您可以只取两个参数并计算出它们在控制器中的内容。

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

控制器动作:

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

不是特别优雅,但确实让您拥有所需的 URL。

于 2009-01-06T16:36:22.520 回答
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
        ); 

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

需要更多测试,但到目前为止运行良好......

于 2009-01-07T13:40:40.720 回答
0

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

这样,您只需几行代码就可以以任何方式处理它......

于 2009-01-06T15:47:03.477 回答