MVC控制器。执行区域

时间:2013-04-10 19:48:06

标签: redirect asp.net-mvc-4 asp.net-mvc-areas

我在MVC4中有一个使用区域的网站。在某些区域(我们称之为区域),我有一个控制器(控制器),有这个动作:

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

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

如果我像这样简单地重定向到Area / Controller / OtherAction,那么这很有用:

return RedirectToAction("OtherAction", "Controller", new { area = "Area" });

但我需要(check here why)进行这样的重定向:

RouteData routeData = new RouteData();
routeData.Values.Add("area", "Area");
routeData.Values.Add("controller", "Controller");
routeData.Values.Add("action", "OtherAction");
ControllerController controller = new ControllerController();
controller.Execute(new RequestContext(new HttpContextWrapper(HttpContext.ApplicationInstance.Context), routeData));

在这种情况下,它不起作用。在最后一行之后,执行OtherAction方法,然后在此代码的最后一行中抛出此异常:

  

未找到视图“索引”或其主控或没有查看引擎   支持搜索的位置。以下地点是   搜寻:

     

〜/查看/控制器/ Index.aspx的

     

〜/查看/控制器/ Index.ascx

     

〜/查看/共享/ Index.aspx的

     

〜/查看/共享/ Index.ascx

     

〜/查看/控制器/ Index.cshtml

     

〜/查看/控制器/ Index.vbhtml

     

〜/查看/共享/ Index.cshtml

     

〜/查看/共享/ Index.vbhtml

为什么会发生这种情况,我该如何解决?

1 个答案:

答案 0 :(得分:10)

您得到异常,因为ASP.NET MVC尝试在“根”上下文中查找您的视图而不是在区域视图目录中查找,因为您没有在routeData中正确设置区域。

area密钥需要在DataTokens个集合中设置,而不是在Values

中设置
RouteData routeData = new RouteData();
routeData.DataTokens.Add("area", "Area");
routeData.Values.Add("controller", "Controller");
routeData.Values.Add("action", "OtherAction");
//...