URL блога ASP.NET MVC через маршрутизацию - PullRequest
3 голосов
/ 07 ноября 2011

Допустим, у меня был свежий сайт MVC, и я хотел реализовать URL следующим образом. Каковы некоторые мысли о лучшем способе сделать это с точки зрения маршрутизации? Я буду хранить сообщения в базовой таблице базы данных. Я хотел бы сделать это как можно более простым с точки зрения контроллера / действия.

/ 2011 / (все посты с 2011 года)

/ 2011/11 / (все сообщения с ноября 2011 г.)

/ 2011/11/07 (все сообщения от 7 ноября 2011 г.)

/ 2011/11/07 / точный пост-заголовок

/ точным после заголовка

/ о

/ архив

/ теги / все-таг

Ответы [ 2 ]

7 голосов
/ 07 ноября 2011
// matches /2011/11/07/exact-post-title
routes.MapRoute(
    "ArticleDetails",
    "{yyyy}/{mm}/{dd}/{title}",
    new { controller = "Articles", action = "Details",
    new { yyyy = @"(19|20)\d\d.", mm = @"\d\d", dd = @"\d\d" }
);

// matches /2011/11/07
routes.MapRoute(
    "ArticlesByDay",
    "{yyyy}/{mm}/{dd}",
    new { controller = "Articles", action = "ByDay",
    new { yyyy = @"(19|20)\d\d.", mm = @"\d\d", dd = @"\d\d" }
);

// matches /2011/11
routes.MapRoute(
    "ArticlesByMonth",
    "{yyyy}/{mm}",
    new { controller = "Articles", action = "ByMonth",
    new { yyyy = @"(19|20)\d\d.", mm = @"\d\d" }
);

// matches /2011
routes.MapRoute(
    "ArticlesByYear",
    "{yyyy}",
    new { controller = "Articles", action = "ByYear",
    new { yyyy = @"(19|20)\d\d." }
);

Существует какая-то проблема с маршрутом / точный-после-заголовка.Это будет соответствовать почти всем, что вы отправляете.Вы должны были бы указать любой другой возможный маршрут перед этим, чтобы это исправить.Вы также можете просто добавить все эти маршруты к / blog или / article, чтобы исправить это:

routes.MapRoute(
    "ExactPostTitle",
    "articles/{title}", 
    new { controller = "Articles", action = "Details" }
);

Теперь это не будет конфликтовать со следующим:

routes.MapRoute(
    "About",
    "about",
    new { controller = "Home", action = "About" }
);

Архив будетаналогично:

routes.MapRoute(
    "Archive",
    "archive",
    new { controller = "Home", action = "Archive" }
);

И, наконец, маршрут тега:

routes.MapRoute(
    "Tag",
    "tag/{tagtext}",
    new { controller = "Tag", action = "Index" }
);

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

Если у вас были следующие маршруты:

routes.MapRoute(
    "ExactTitle",
    "{title}",
    new { controller = "Articles", action = "Details" }
);

routes.MapRoute(
    "About",
    "about",
    new { controller = "Home", action = "About" }
);

Первый маршрут соответствует / примерно, так что вы столкнетесь с проблемами, если они в этом порядке.

4 голосов
/ 30 января 2016

Мое решение таково:

сначала включить в RouteConfig.cs

          routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        **routes.MapMvcAttributeRoutes();** this is very important 
        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

после включения в действие контроллера необходимого вам маршрута:

    [Route("Posts/{year}/{month}/{day}/{title}")]
    public ActionResult Post(int year, int month, int day, string title)
    {
        return View();
    }

    [Route("Posts/{year}/{month}/{day}")]
    public ActionResult Post(int year, int month, int day)
    {
        return View();
    }

    [Route("Posts/{year}/{month}")]
    public ActionResult Post(int year, int month)
    {
        return View();
    }

    [Route("Posts/{yearOrTitle}")]
    public ActionResult Post(string yearOrTitle)
    {
//logical to search year or Title
        return View();
    }
...