我对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。
有没有人遇到过这种困境?你是怎么处理的?
提前致谢!
答案 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)
为什么不在页面中为每个可能的查询字符串参数创建属性?
通过这种方式,您可以通过几行代码以任何方式处理它......