Возникли проблемы с маршрутизацией MVC - PullRequest
0 голосов
/ 06 февраля 2009

Я пытаюсь реализовать маршрутизацию, например:

сообщений / 535434 / Это-это-пост-название

posts/tagged/tags+here
// Matches {controller}/{action}/{id} - Default
// Displays all posts with the specified tags
// uses PostsController : ActionTagged(string tags)

posts?pageSize=50&pageIndex=4
// Matches {controller}/{action}/{id} - Default
// Displays all posts
// uses PostsController : Index(int? pageSize, int? pageIndex)

Вот проблема, которую я хочу сделать:

posts/39423/this-is-a-post-title-here
// Typically this is implemented using an action like 'Details'
// and would normally look like : posts/details/5

Кажется, я не могу правильно настроить маршрутизацию. Я пробовал что-то вроде этого:

{controller}/{id}/{description}

и установите действие по умолчанию «Показать», которое работает, но не позволяет мне переходить к другим именованным действиям, таким как «Помеченные».

Чего мне не хватает?

Спасибо!

Ответы [ 3 ]

1 голос
/ 06 февраля 2009

Две вещи:

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

Итак, мы хотим определить {controller} / {postid} / ... (должен быть postid), прежде чем мы определим {controller} / {action} / ... (может быть что-то еще)

Далее, мы хотим иметь возможность указать, что если предоставленное значение для postid не похоже на Post ID, маршрут должен потерпеть неудачу и перейти к следующему. Мы можем сделать это, создав класс IRouteConstraint:

public class PostIDConstraint : IRouteConstraint
{ 
  public bool Match(HttpContextBase httpContext,
    Route route,
    string parameterName, 
    RouteValueDictionary values, 
    RouteDirection routeDirection)
  {
    //if input looks like a post id, return true.
    //otherwise, false
  }
}

Мы можем добавить его в определение маршрута следующим образом:

routes.MapRoute(
    "Default",
    "{controller}/{postid}/{description}",
    new { controller = "Posts", action = "Display", id = 0 },
    new { postid = new PostIDConstraint() }
);
0 голосов
/ 06 февраля 2009

Часть URL, которая является «описанием», фактически не используется. Например, этот пост - 519222, и я все еще могу получить его, используя URL: Проблемы с маршрутизацией MVC

0 голосов
/ 06 февраля 2009

Я не на 100% понимаю ваш вопрос, но, похоже, вы можете просто определить пару разных маршрутов.

routes.MapRoute("PostId", "posts/{id}/{title}",
    new { Controller = "Posts", Action = "DisplayPost", id = 0, title = "" },
    new { id = @"\d+" });

routes.MapRoute("TaggedPosts", "posts/tagged/{tags}",
    new { Controller = "Posts", Action = "DisplayTagged", tags = "" });

routes.MapRoute("Default", "posts",
    new { Controller = "Posts", Action = "Index" });

Вы можете использовать регулярные выражения для проверки параметров, которые я использовал для идентификатора на первом маршруте, или если вы хотите улучшить проверку, сделайте что-нибудь вроде Rex M. Параметры строки запроса pageSize и pageIndex не обязательно должны быть включены в ваш маршрут; они будут просто переданы в ваш метод Index при условии совпадения имен параметров.

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