2012-01-20 1 views
3

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

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

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

public ActionResult Index(int schoolId) 
{ ... 

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

ответ

4

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

Да, вы можете. Вы можете переопределить метод 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 будет уже на месте, когда он придет к их вызову.

0

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

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

2

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

Нечто подобное (не показано кэширование)

public ActionResult Index(string schoolName) 
{ 
var schoolId = SomeMethodThatGetsTheIdFromString(schoolName) 
RedirectToAction("Index", new { id = schoolId }); 
} 
Смежные вопросы