Маршрутизация asp.net MVC - это возможно? - PullRequest
1 голос
/ 23 февраля 2010

могу ли я иметь domain.com/action/id и domain.com/controller/action?

как мне зарегистрировать их в таблице маршрутов?

Ответы [ 2 ]

2 голосов
/ 23 февраля 2010

Всегда ли ID гарантированно будет числом? Если да, то вы можете использовать RouteConstraints :

routes.MapRoute("ActionIDRoute",
               "{action}/{id}",
               new { controller = "SomeController" },
               new {id= new IDConstraint()});
routes.MapRoute("ControllerActionRoute",
                "{controller}/{action}",
                new {}); // not sure about this last line

Класс IDConstraint выглядит следующим образом:

public class IDConstraint : IRouteConstraint
{
    public bool Match(HttpContextBase httpContext, Route route,
                      string parameterName, RouteValueDictionary values,
                      RouteDirection routeDirection)
    {
        var value = values[parameterName] as string;
        int ID;
        return int.TryParse(value,out ID);
    }
}

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

Итак:

  1. Звоните http://localhost/SomeController/SomeAction
  2. Он попадет в ActionIDRoute, так как у него два заполнителя
  3. Поскольку существует ограничение на параметр id (SomeAction), ASP.net MVC вызовет функцию Match ()
  4. При сбое int.TryParse в SomeAction маршрут отбрасывается
  5. Следующий соответствующий маршрут - ControllerActionRoute
  6. Поскольку это соответствует и на него нет ограничений, будет принято

Если ID не гарантированно является числом, значит, у вас возникла проблема с устранением неоднозначности. Единственное известное мне решение - это жесткое кодирование маршрутов, где применяется {action} / {id}, что не всегда возможно.

1 голос
/ 23 февраля 2010

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

routes.MapRoute(
  "MyRole",  // Route name
  "{action}/{id}",  // URL with parameters
  new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);

Образец перенаправляет все действия на контроллер «Home».

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