2013-04-10 3 views
5

У меня есть сайт в MVC4 с использованием областей. В какой-то области (назовём его Area), у меня есть контроллер (контроллер) с этим действий:MVC controller.Execute с областями

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» или его хозяин не было найдено или нет вида двигателя поддерживает искомых местоположение , Следующие места были искали:

~/Views/Controller/index.aspx

~/Views/Controller/Index.ascx

~/Views/Shared/index.aspx

~/Просмотров/Shared/Index.ascx

~/Просмотров/Controller/Index.cshtml

~/Views/Controller/Index.vbhtml

~/Просмотров/Shared/Index.cshtml

~/Views/Shared/Index.vbhtml

Почему это происходит и как я могу это исправить?

ответ

9

Вы получаете исключение, потому что 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"); 
//... 
Смежные вопросы