ASP.Net MVC3: настроить маршрутизацию для обработки нескольких уникальных идентификаторов? - PullRequest
0 голосов
/ 29 сентября 2011

Я создаю приложение MVC, которое состоит из объектов, на которые могут ссылаться два разных уникальных идентификатора, некрасивый сгенерированный системой идентификатор и более удобный для пользователя 5-кратный «короткий код».Например, я хотел бы, чтобы мои конечные пользователи могли вводить следующие URL-адреса в своих браузерах:

http://intranet/PRJ2011004

http://intranet/DEP42

Опять оба кодауникальны.У меня правильно настроена маршрутизация для первого URL.Когда пользователь вводит этот URL, он получает правильную страницу с индексной страницей для объекта: PRJ201104.

Как настроить маршрут для обработки второго сценария?Предпочтительно есть способ «обмануть» MVC, чтобы изменить значение, которое он передает контроллеру от краткого кода к проекту.

Я хотел бы получить способ перехватить 5-символьный маршрут короткого кода, взять предоставленное значение и найти его в моей таблице сущностей, а затем, если я найду подходящую запись, которую я хотел бы либо (в порядке предпочтения):

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

И если я не найду подходящую сущность, использующую это значение короткого кода, я позволю продолжить свою стандартную обработку маршрута (например, мои контроллеры «Ошибка» и «Администратор», которыеоба 5 символа, но не короткие коды, будут продолжать работать должным образом.

TIA

1 Ответ

0 голосов
/ 29 сентября 2011

Пользовательский маршрут может сделать работу:

public class MyRoute : Route
{
    public MyRoute(string url, object defaults)
        : base(url, new RouteValueDictionary(defaults), new MvcRouteHandler())
    { }

    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        var rd = base.GetRouteData(httpContext);
        var id = rd.Values["id"] as string;
        if (id == null)
        {
            return rd;
        }

        // TODO: if you think that the id provided is a pretty id
        // query the database to fetch the other id

        if (IsPrettyId(id))
        {
            id = FetchCorrespondingId(id);
            rd.Values["id"] = id;
        }
        return rd;
    }
}

и затем зарегистрируйте этот пользовательский маршрут:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    routes.Add(
        "Default",
        new MyRoute(
            "{controller}/{action}/{id}",
            new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        )
    );
}

Теперь внутри действия контроллера у вас всегда будет длинный уродливый идентификатор:

public ActionResult Index(string id)
{

}
...