RedirectToAction игнорирует область после маршрутизации - PullRequest
0 голосов
/ 14 июня 2011

У меня есть Область с именем «Подписчики» и контроллер в этой области с именем «SubscriptionController» с двумя методами открытого действия: Index () и Unsubscribe (), где методу Unsubscribe () передается идентификатор подписчика, т.е. Unsubscribe (int id) )

При определенных обстоятельствах (например, идентификатор недействителен), метод Unsubscribe () выполняет RedirectToAction («Index») для другого действия на том же контроллере.

public ActionResult Index()
{
    return View();
}

если я захожу на страницу через '/ Subscribeers / Subscription / Unsubscribe / 999', RedirectToActionMethod () правильно перенаправляет меня на действие Index ().

Я хотел иметь возможность «сокращать» формальный URL ('/ Подписчики / Подписки / Отписаться / 999'), поэтому я добавил маршрут к файлу Global.ascx:

routes.MapRoute(
    "Unsubscribe",
    "Unsubscribe/{id}",
    new {area = "Subscribers", controller = "Subscriptions", action = "Unsubscribe"}
);

Этот маршрут работает правильно, так как он выполняет метод Unsubscribe (), как и ожидалось. У меня проблема в том, что вызовы RedirectToAction («Index») в Unsubscribe () теперь не выполняются, так как они все еще вызывают правильное действие (Index ()), механизм представления теперь игнорирует Area и пытается загрузить представление относительно корень веб-сайта «~ / Views / Subscription / Index.aspx» вместо «~ / Areas / Подписчики / Views / Subscription / Index.aspx»

Я могу исправить это, изменив метод RedirectToAction () в методе Unsubscribe () следующим образом:

return RedirectToAction("Index", "Subscriptions", new { Area = "Subscribers" });

но это кажется громоздким и не очень гибким решением проблемы.

Любой совет или объяснение будет высоко ценится.

Спасибо.

1 Ответ

0 голосов
/ 15 июня 2011

Я думаю, что я исправил проблему.

Маршрутизация должна идти в методе RegisterArea Района:

public override void RegisterArea(AreaRegistrationContext context)
{
    context.MapRoute(
        "Subscribers_unsubscribe",
        "Unsubscribe/{id}",
        new { controller = "Subscriptions", action = "Unsubscribe", id = UrlParameter.Optional }
    );

    context.MapRoute(
        "Subscribers_default",
        "Subscribers/{controller}/{action}/{id}",
        new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}
...