Маршруты MVC3 - заменить идентификатор на имя объекта - PullRequest
0 голосов
/ 04 июня 2011

Я ищу быстрый и элегантный способ преобразования идентификаторов моих объектов с описательными именами, чтобы мои автоматически сгенерированные маршруты выглядели так:

/products/oak-table-25x25-3-1

вместо

/products/5bd8c59c-fc37-40c3-bf79-dd30e79b55a5

В этом примере:

uid  = "5bd8c59c-fc37-40c3-bf79-dd30e79b55a5"
name = "Oak table (25x25) 3/1"

Я даже не знаю, как можно назвать эту функцию, чтобы я мог поискать ее в Google.

Проблема, которую я вижу до сих пор, заключается в уникальности этого "url-object-name", например, если у меня есть две дубовые таблицы 25x35 в БД, и их имена отличаются слишком мало, чтобы быть уникально, но достаточно обмануть уникальное ограничение в БД.

Я думаю о том, чтобы написать эту функцию для преобразования имен в SQL как UDF, затем добавить вычисляемое поле, которое возвращает его, а затем ограничить уникальные значения этого поля.

Есть ли еще какой-нибудь основной способ достижения этого?

Ответы [ 4 ]

1 голос
/ 04 июня 2011

Удостоверение должно иметь 2 свойства: оно должно быть уникальным и неизменным .Если вы можете гарантировать, что /products/oak-table-25x25-3-1 никогда не изменится на /products/oak-table-25x25-3-1-1 (помните, у пользователя могут быть закладки, которые не должны возвращать код состояния 404) - вы можете использовать имя в качестве параметра url и получать запись по этому параметру.

Если вы не можете гарантировать уникальность или хотите выбрать запись быстрее - используйте следующее:

  1. /products/123/oak-table-25x25-3-1 - получить запись по id (123)
  2. /products/123/blablabla - следует перенаправить в первую очередь, потому что blabla no не существует или имеет другой идентификатор
  3. /products/123 - следует перенаправить в первую очередь

И попытаться использовать более короткие идентификаторы - помните,что в web 2.0 url является частью пользовательского интерфейса, и пользовательский интерфейс должен быть дружественным.

1 голос
/ 04 июня 2011

Один из методов, который используется stackoverflow.com, в вашем случае:

/ products / 5bd8c59c-fc37-40c3-bf79-dd30e79b55a5 / oak-table-25x25-3-1

Это обеспечивает уникальность, однако длина UUID может быть сдерживающим фактором.Вы можете добавить последовательное значение int или bigint в таблицу продуктов в дополнение к полю uniqueidentifier.Это, однако, потребовало бы дополнительного индекса для этого столбца для поиска, хотя аналогичный индекс был бы необходим для URL-адреса, имеющего только дескриптивную строку.Еще одним методом будет использование хеш-значения, например, по дате, которое вы можете составить с описательным именем.Проще полагаться на последовательное значение идентификатора, сгенерированное базой данных, но если вы планируете использовать механизмы хранения NoSQL в будущем, вы можете использовать внешнее сгенерированное значение хеша для добавления.

0 голосов
/ 04 июня 2011

Я сделал нечто очень похожее на платформе электронной коммерции, над которой я работаю.

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

Решением было реализовать функциональность .NET MVC «URL-адрес только для слаг». Менеджер по продукту создает «слизни» для каждого продукта, которые являются уникальными и присваиваются продуктам. Они ссылаются на продукт, но идентификатор продукта и название могут быть изменены в любое время.

Это позволяет:

domain.com / дуб стол-25x25-3-1

указывать на:

/ продукция / 5bd8c59c-fc37-40c3-bf79-dd30e79b55a5

(ту же функциональность можно использовать и в категориях, поэтому domain.com/tables может указывать на domain.com/category/5b38c79c-f837-42c3-bh79-dd405479b15b5)

Я задокументировал, как я это сделал: http://makit.net/post/3380143142/dotnet-slug-only-urls

0 голосов
/ 04 июня 2011

MVC маршрутизация (действия) будет обрабатывать пробелы и косые черты в имени.Он будет кодировать их как% 20, а затем правильно их декодировать.

Таким образом, ваш URL будет /products/oak%20table%2025x25-3%2F1

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