Маршрутизация и действия контроллера - дополнительные данные - PullRequest
0 голосов
/ 15 ноября 2010

Я создал маршрут в приложении ASP.net MVC, который выглядит следующим образом:

routes.MapRoute(
    "ArticleRoute",
    "{year}/{month}/{day}/{articleId}/{displayName}",
    new { controller = "Article", action = "Details" }
);

Мне нужен маршрут, который будет похож на статью в блоге.

Пример: http://www.foobar.com/2010/01/01/123456789/the-name-of-the-article

В моем действии контроллера «Подробности» я хочу сделать перманентное перенаправление, если год, месяц, дата и отображаемое имя не верны.Я хочу знать, как лучше написать метод контроллера Details ().

Единственное поле, которое действительно является обязательным, это articleId.Если у меня есть идентификатор статьи, то в базе данных будут указаны дата и имя статьи.

Я действительно хочу знать, как должен выглядеть метод контроллера.Должен ли я передать все значения методу или использовать RouteData для их получения?

public ActionResult Details(int articleId, string displayName)
{
    var article = */SNIP*/;

    int articleYear = RouteData.Values["year"];
    // etc.
    DateTime articleDate = new DateTime(articleYear, articleMonth, articleDay);

    string realDisplayName = article.Name.ToSeoString();

    if( displayName != realDisplayName || article.Date != articleDate)
        // permanent redirect to the actual article

    return View();
}

ИЛИ

public ActionResult(int year, int month, int day, int articleId, string displayName)
{
    var article = /*SNIP*/;

    DateTime articleDate = new DateTime(year, month, day);

    string realDisplayName = article.Name.ToSeoString();

    if( displayName != realDisplayName || article.Date != articleDate )
        // permanent redirect to the actual article

    return View();
}

Я думаю, что оба технически работают, нокакой путь лучше?

Также: если есть какие-то другие недостатки в том, что я делаю, не стесняйтесь указывать на них.

Ответы [ 4 ]

1 голос
/ 16 ноября 2010

Я предпочитаю RESTFul URL-адреса для запроса строк, потому что они понятны, легко читаются пользователями и удобны для SEO.

В вашем случае, если вы действительно хотите, чтобы URL был ... / 2010/01/01/123456789 / the-name-of-the-article, второй метод лучше.

Но я думаю, что нет необходимости использовать данные / месяц, если вы используете идентификатор статьи в URL.

Такие приложения, как WordPress, используют формат / year / month / title, потому что если вы просто дадите заголовок статьи, запрос к базе данных займет больше времени. Но с указанием года и месяца вы можете ускорить запросы к БД, поскольку вы можете сузить результаты, а затем выполнить поиск заголовка по этому набору результатов.

Я думаю, вы должны использовать маршрут вроде ... / 123456789 / the-name-of-the-article

См. URL этого вопроса: Маршрутизация и действия контроллера - дополнительные данные здесь название вопроса используется только для целей seo.

Если вы хотите, чтобы дизайн был чистым и спокойным, тогда URL должен быть ... / article / the-name-of-the-article

Я создаю URL-адреса, подобные этому, поскольку есть много способов оптимизировать запросы к базе данных (например, хэширование), и я ЛЮБЛЮ чистый REST.

0 голосов
/ 16 ноября 2010

Строки запроса намного лучше, чем REST URL.Маршруты взяты из первых дней HTTP, но были пропущены для строк запросов для многих веб-сайтов, поскольку параметры зависят от построения маршрута.Кроме того, маршруты не подходят для шифрования параметров, когда это необходимо.

0 голосов
/ 16 ноября 2010

Лучше передавать все, потому что ваши параметры строго типизированы, а коллекция RouteData.Values ​​- нет. Вы также можете использовать элементы RouteData.Values, но это дополнительный код, который вам не нужно делать. Это еще один пример того, как ASP.NET MVC выполняет код для вас, поэтому у вас меньше контроля, если вы хотите сделать что-то другое. Веб-формы более прозрачны для того, что на самом деле делает фреймворк, тогда как MVC - это дым и зеркала.

0 голосов
/ 16 ноября 2010

В первом примере, какой смысл передавать что-либо, если вы собираетесь использовать RouteData.Values ​​для получения некоторых значений?

Кроме того, является ли var article = ... меткой-заполнителемпока, пока вы не подключите поиск по базе данных?

Со стороны клиента это не имеет значения, потому что URL не будет отличаться.

На стороне сервера второй пример выглядит чище в коде, потому что у вас нет поиска RouteData.Values.

...