Подводные камни отклонения от формата REST URL {controller} / {action} / {id} для ASP.NET MVC? - PullRequest
0 голосов
/ 09 марта 2009

Я скоро запустлю новый сайт. Один раздел сайта содержит товары.

В настоящее время я пытаюсь выбрать между различными URL-адресами для маршрутизации ASP.NET:

** Продукты: **

 /products/1001
 /products/sku/1001
 /products/product/1001
 /products/view/1001

** Категории: **

 /products/category/cats
 /products/category/clothing

 /products/cats         - this is pretty nasty
 /products/clothing

Я прежде всего пытаюсь решить, что из следующего я должен принять. Я сейчас делаю первый.

  routes.MapRoute(
    "product-route-short",
    "products/{sku}",
    new { controller = "Products", action = "ViewProduct", sku = "1001"}
  );

или

  routes.MapRoute(
    "product-route-short",
    "products/sku/{sku}",
    new { controller = "Products", action = "ViewProduct", sku = "1001"}
  );

или один из следующих

 * call the action 'sku' , 'details' , 'item'
 * use an [ActionName] attribute and leave the action method name as 'ViewProduct'

Мне очень нравится простота /products/1001, чтобы пользователь мог ее увидеть и изменить - но есть опасность, что она вступит в конфликт с другими действиями, если я не буду осторожен. Я также должен обязательно использовать 'product-route-short' при создании моих URL, что очень незначительно.

Что кто-нибудь думает? Какой вы нашли лучшую практику? Этот пример довольно прост, но я, конечно, хочу быть единообразным по всему сайту и не хочу, чтобы все было модифицировано, как только Google уже все проиндексировал для меня.

Если есть какие-либо особенно хорошие подкасты или статьи на эту тему (общие или специфичные для ASP.NET), я буду признателен за ссылки на них. Я нашел хороший подкаст, в котором они специально сказали, что «этот подкаст НЕ о том, как создавать хорошие ссылки REST»

Ответы [ 3 ]

4 голосов
/ 09 марта 2009

Я бы направил свои URL на эти цели ...

1) Удобство использования. Очень хорошо, если вы можете сказать, какую страницу вы получите, если вы посмотрите на URL. Если он достаточно короткий, чтобы напечатать и / или угадать, тем лучше.

2) Поисковики. Вы действительно хотите, чтобы ваши ключевые слова в эти URL-адреса. Я знаю, что вы хотите использовать идентификатор для поиска продукта, но люди и поисковые системы хотят видеть название продукта там. Кроме того, чем ближе ключевое слово к началу URL, тем больше его значение.

Это действительно просто скимминг. Если вы хотите получить лучшие URL, вам нужно убедиться, что категории и названия продуктов уникальны, чтобы вы могли искать их, а не использовать идентификаторы в адресе.

Мое предлагаемое соглашение будет ...

/ продукция /

/ продукты / одежда /

/ продукты / одежда / синий-замша обувь /

1 голос
/ 09 марта 2009

Я думаю, что короткие URL вы делаете хорошо. Прелесть механизма маршрутизации asp.net mvc в том, что, если вы правильно сделали ссылки в представлениях, вы можете вносить изменения в маршруты по мере их разработки. Так что не стесняйтесь играть по ходу дела.

Еще одна вещь, которую нужно иметь в виду, это аргумент ограничений в методе MapRoute. Вы всегда можете попробовать что-то вроде этого:

routes.MapRoute( 
"product-route-short", 
"products/{sku}", 
new { controller = "Products", action = "ViewProduct", sku = "1001" } , 
new { sku = @"[0-9]" } 
);

routes.MapRoute( 
"product-route-other", 
"products/{action}/id", 
new { controller = "Products", action = "ViewProduct" } 
);

Этот фильтр сделает так, что будут работать только skus между 0-9. Очевидно, вы захотите использовать регулярное выражение в соответствии с вашим конкретным сценарием, но это поможет вам избежать конфликтов с действиями. В этой ситуации, если значение для sku не было между 0-9, тогда механизм маршрутизации перешел бы к следующему маршруту и ​​попытался бы соответствовать этому. Он будет делать это, пока не найдет совпадение.

Благодаря сочетанию маршрутов и ограничений вы сможете получить очень чистый URL, который имеет смысл для пользователя.

1 голос
/ 09 марта 2009

Обратите внимание, что SO сам перечисляет этот вопрос на stackoverflow.com/questions/625213 (/ впоследствии игнорируется). Так что у тебя хотя бы прецедент есть :).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...