路由后RedirectToAction忽略区域

时间:2011-06-14 12:15:04

标签: model-view-controller routing area redirecttoaction

我有一个名为'Subscribers'的区域和一个名为'SubscriptionsController'的控制器,它有两个公共操作方法:Index()和Unsubscribe(),其中Unsubscribe()方法传递一个订阅者ID,即Unsubscribe(int id )

在某些情况下(例如,id无效),Unsubscribe()方法对同一控制器上的其他操作执行RedirectToAction(“Index”)。

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

如果我通过'/ Subscribers / Subscriptions / Unsubscribe / 999'访问该页面,RedirectToActionMethod()会正确地将我重定向到Index()动作。

我希望能够'快捷'正式网址('/ Subscribers / Subscriptions / Unsubscribe / 999'),所以我添加了一条到Global.ascx文件的路径:

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

此路由似乎正常运行,因为它按预期运行Unsubscribe()方法。我遇到的问题是在Unsubscribe()中调用RedirectToAction(“Index”)现在失败,因为他们仍然调用正确的操作(Index()),视图引擎现在忽略Area并尝试加载相对于网站'〜/ Views / Subscriptions / Index.aspx'的根,而不是'〜/ Areas / Subscribers / Views / Subscriptions / Index.aspx'

我可以通过修改Unsubscribe()方法中的RedirectToAction()方法来解决这个问题:

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

但这似乎是一个麻烦而且不是非常灵活的解决方案。

非常感谢任何建议或解释。

感谢。

1 个答案:

答案 0 :(得分:0)

我想我已经解决了这个问题。

路由需要进入Area的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 }
    );
}
相关问题