Мой маршрут не стреляет, это должно работать? - PullRequest
2 голосов
/ 27 января 2010

Для моей административной области я создал специальный маршрут. Я сделал это так, чтобы мои URL выглядели чище, и это избавило меня от проблемы с двумя контроллерами с одинаковым именем.

Пример: у меня есть UserController и другой AdminUserController для сайта администратора приложения.

Я не хочу, чтобы URL-адреса были такими:

http://www.example.com/user/...
http://www.example.com/admin/adminuser/...

Я хочу, чтобы админские URL выглядели так:

http://www.example.com/admin/user/...

Теперь, чтобы получить эту структуру URL, я попробовал это:

Я назвал свой контроллер администратора: AdminUserController

Тогда мой маршрут выглядит так:

routes.Add(new Route("admin/Admin{controller}/{action}/{id}", new MvcRouteHandler())
{
  Defaults = new RouteValueDictionary(new { controller = "Admin", action = "index", Id=""});
});

Может ли это работать? (маршрут в данный момент не работает)

Я позаботился о том, чтобы этот маршрут был выше общего маршрута.

Обновление

Я хочу, чтобы все мои админские URL имели префикс папки / admin /, поэтому:

www.example.com/admin/user
www.example.com/admin/settings
www.example.com/admin/articles

и без прав администратора похожи на:

www.example.com/user
www.example.com/articles

Ответы [ 4 ]

3 голосов
/ 27 января 2010
routes.Add(new Route("admin/Admin{controller}/{action}/{id}", new MvcRouteHandler())
{
  Defaults = new RouteValueDictionary(new { controller = "Admin", action = "index", Id=""});
});

заставит вас иметь "admin / AdminUser" ...

 routes.MapRoute(
                "Default",                                              // Route name
                "admin/{action}/{id}",                           // URL with parameters
            new { controller = "Admin", action = "User", id = "" }  // Parameter defaults
        );

позволит вам иметь контроллер администратора с действием User


Более точно, что вы хотите сделать, это создать область (используйте MVC 2)

http://odetocode.com/Blogs/scott/archive/2009/10/13/asp-net-mvc2-preview-2-areas-and-routes.aspx

должен дать вам то, что вы хотите ...

3 голосов
/ 27 января 2010

Нет, это не сработает.

Имейте в виду, что мы добавляем "Controller" к части URL, переданной для {controller}. Таким образом, URL, который будет работать там:

/ администратор / AdminAdminUser /

Попробуйте вместо этого.

routes.Add(new Route("admin/user/admin/{action}/{id}", new MvcRouteHandler())
{
  Defaults = new RouteValueDictionary(new { controller = "AdminUser", action = "index", Id=""})
});

Я предполагаю, что контроллер AdminUser - это особый случай, и у вас нет других контроллеров, которые начинаются с / user /. Если вы это сделали, альтернативный подход заключается в переименовании AdminUserController обратно в AdminController. Тогда:

routes.Add(new Route("admin/user/{controller}/{action}/{id}", new MvcRouteHandler())
{
  Defaults = new RouteValueDictionary(new { controller = "Admin", action = "index", Id=""}),
  Constraints = new RouteValueDictionary(new { controller = "Admin|Other|Other2"})
});

Здесь я использую ограничение, чтобы ограничить, к каким контроллерам этот конкретный маршрут применяется.

Кстати, я бы рекомендовал использовать методы расширения MapRoute. Они значительно упрощают регистрацию маршрута.

0 голосов
/ 28 января 2010

Создайте реализацию IRouteHandler, которая будет перехватывать запрошенный контроллер и добавлять «admin» в начало

public class AdminRouteHandler : IRouteHandler
{
    private readonly IRouteHandler _mvcHandler = new MvcRouteHandler();
    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        var values = requestContext.RouteData.Values;
        if(values.ContainsKey("controller"))
            values["controller"] = "Admin" + values["controller"];
        return _mvcHandler.GetHttpHandler(requestContext);
    }
}

И используйте это при регистрации маршрута, заменив Home на любой контроллер, на который admin / должен направить вас. Если оставить значение Home по умолчанию, оно будет равно AdminHome после прохождения через AdminRouteHandler.

routes.Add(new Route("admin/{controller}/{action}/{id}", new AdminRouteHandler())
{
  Defaults = new RouteValueDictionary(new { controller = "Home", action = "index",     Id=""});
});
0 голосов
/ 28 января 2010

С 1.0 единственный способ сделать это:

Используя 1.0, единственный способ сделать это - сопоставить каждый контроллер отдельно, используя

   routes.MapRoute(
            "AdminUserRoute",                     // Route name
            "admin/user/{action}/{id}",           // URL with parameters
        new { controller = "AdminUser", action = "Index", id = "" } 
    );

   routes.MapRoute(
            "AdminWorkRoute",                    // Route name
            "admin/work/{action}/{id}",          // URL with parameters
        new { controller = "AdminWork", action = "Index", id = "" }                
    );
...