2011-06-14 56 views
0

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

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

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

如果我通过 '/订户/订阅/取消/ 999' 访问该页面的RedirectToActionMethod()正确重定向我到Index()动作。

我希望能够到“快捷方式”正式URL(“/订户/订阅/取消/ 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'

我可以通过修改RedirectToAction Unsubscribe()方法如下:

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

但是这看起来像一个麻烦而不是非常灵活的解决方案的问题。

任何意见或解释将不胜感激。

谢谢。

回答

0

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

路由需要在该地区的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 } 
    ); 
}