0

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

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

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

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

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

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

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

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

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

但这似乎是一个麻烦且不是很灵活的问题解决方案。

任何建议或解释将不胜感激。

谢谢。

4

1 回答 1

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 }
    );
}
于 2011-06-15T06:16:34.843 回答