Можно ли изменить параметр маршрута URL с другим значением - PullRequest
3 голосов
/ 20 января 2012

У меня есть проект asp.mvc. В настоящее время маршрутизация настроена на формирование следующих URL:

site/school/45
site/school/45/courses
site/school/45/teachers
site/school/45/courses/17
etc.

Я хочу изменить это «45» (идентификатор школы) на более «удобное для пользователя» имя, например на «Название» школы «45». Теперь методы действия похожи на:

public ActionResult Index(int schoolId)
{ ...

Можно ли изменить маршрут для отображения названия школы вместо schoolID без изменения методов действия?

Ответы [ 3 ]

4 голосов
/ 20 января 2012

«без изменения методов действия», кажется, самая важная часть вашего вопроса, верно?

Да, вы можете.Вы можете переопределить метод OnActionEcecuting(ActionExecutingContext filterContext) в вашем классе контроллера, чтобы сделать отображение имени-идентификатора за вас.Вам нужно сделать следующее:

  1. Реализовать базовый класс контроллера, что-то вроде этого:

    public class BaseController: Controller
    {
            protected override void OnActionExecuting(ActionExecutingContext filterContext)
            {
                base.OnActionExecuting(filterContext);
                var shoolName = filterContext.RouteData.Values["schoolName"].ToString();
                var schoolId = ...; // Get school id from name somehow here
                filterContext.RouteData.Values.Add("schoolId", schoolId);
            }
    }
    

    (здесь я предполагаю, что вы измените имя соответствующего параметра маршрутизацииот schoolId до schoolName в Global.asax.cs / RegisterRoutes).

  2. Обновите все свои контроллеры, сделав их наследниками не от Controller, а от BaseController, какэто:

    public class SomethingController: BaseController
    {
        ...
    }
    

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

2 голосов
/ 20 января 2012

Вам нужно будет добавить новый маршрут в глобальную маршрутизацию, чтобы разрешить использовать имя строки, а не только int id.Наилучшим вариантом будет создание нового метода, который принимает имя школы, а затем (из базы данных или кэшированного объекта / словаря) преобразует имя в идентификатор, а затем пересылает его в метод индекса int.

Что-то вродеэто (не показано кеширование)

public ActionResult Index(string schoolName)
{
 var schoolId = SomeMethodThatGetsTheIdFromString(schoolName)
 RedirectToAction("Index", new { id = schoolId });
}
0 голосов
/ 20 января 2012

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

Однако я бы предложил оставить ваш маршрут таким, какой он есть - например, если название школы изменится, это будет означать, что все закладки больше не будут работать, или ваш URL будет отображаться неправильно.

...