2013-04-10 8 views
5

Ho un sito in MVC4 utilizzando le aree. In una certa zona (consente di chiamare Area), ho un controllore (Controller) con queste azioni:Controller MVC. Esegui con aree

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

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

Questa grande opera se faccio un semplice redirect A Area/Controller/OtherAction come questo:

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

ma ho bisogno (check here why) per fare un redirect in questo modo:

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)); 

E in questo caso non funziona. Dopo l'ultima riga, il metodo OtherAction viene eseguito e poi in ultima riga di questo codice che genera questa eccezione:

La vista 'indice' o il suo padrone non è stato trovato o nessun motore di visualizzazione supporta le posizioni ricercate . Le seguenti posizioni sono stati cercati :

~/Vista/Controller/Index.aspx

~/Vista/Controller/Index.ascx

~/Vista/Shared/Index.aspx

~/Vista/shared/Index.ascx

~/Vista/controller/Index.cshtml

~/Vista/controller/Index.vbhtml

~/views/Shared/Index.cshtml

~/Vista/Shared/Index.vbhtml

Perché succede questo e come posso risolvere il problema?

risposta

9

Si ottiene l'eccezione perché ASP.NET MVC tenta di cercare la propria vista nel contesto "root" e non all'interno della directory di visualizzazione area perché non si sta configurando correttamente l'area in routeData.

Le area chiave deve essere impostato nelle DataTokens collezioni e non nel Values

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