2010-04-12 16 views
12

Possiedo un progetto che utilizza aree MVC. L'area ha l'intero progetto al suo interno mentre le cartelle principali "Viste/Controllori/Modelli" all'esterno delle aree sono vuote salvo il controller di invio che ho configurato che indirizza le richieste in ingresso predefinite al controller principale nella mia area.Aree MVC - Visualizzazione non trovata

Questo controller dispone di un metodo come segue: -

public ActionResult Index(string id) 
    { 
     return RedirectToAction("Index", "Home", new {area = "xyz"}); 
    } 

Ho anche un percorso di installazione di default per utilizzare questo controller come segue: -

routes.MapRoute(
      "Default",            // Default route 
      "{controller}/{action}/{id}", 
      new { controller = "Dispatch", action = "Index", id = UrlParameter.Optional } 
     ); 

Eventuali richieste di default al mio sito sono adeguatamente indirizzato verso l'area pertinente. Metodo "RegisterArea" di tale zona ha un unico percorso: -

context.MapRoute(
      "xyz_default", 
      "xyz/{controller}/{action}/{id}", 
      new { action = "Index", id = UrlParameter.Optional } 

mia zona ha più controller con un sacco di punti di vista. Qualsiasi chiamata a una vista specifica in questi metodi del controller come "return View (" blah "); visualizza la vista corretta. Tuttavia ogni volta che provo a restituire una vista insieme a un oggetto modello passato come parametro, ottengo l'errore seguente : -.

Server Error in '/DeveloperPortal' Application. 
The view 'blah' or its master was not found. The following locations were searched: 
~/Views/Profile/blah.aspx 
~/Views/Profile/blah.ascx 
~/Views/Shared/blah.aspx 
~/Views/Shared/blah.ascx 

sembra ogni volta che un oggetto del modello è passato come parametro per il "View()" metodo [ad esempio Return ("bla", obj)] si cerca per la vista in la radice del progetto invece che nella cartella di visualizzazione specifica area.

che cosa mi manca qui?

Grazie in anticipo.

risposta

3

Se si tratta di un problema di routing, è possibile risolvere il problema registrando i percorsi di zona prima. Questo fa sì che il motore di routing per provare corrispondenza uno dei percorsi della zona, prima corrispondenza di un percorso radice:

AreaRegistration.RegisterAllAreas(); 
RegisterRoutes(RouteTable.Routes); 

Se forzo un errore rinominando una delle mie visite al cartelle nella mia applicazione settori, ho un diverso errore della tua:

The view 'Index' or its master was not found. The following locations 
    were searched: 

~/Areas/xyz/Views/Document/Index.aspx 
~/Areas/xyz/Views/Document/Index.ascx 
~/Areas/xyz/Views/Shared/Index.aspx 
~/Areas/xyz/Views/Shared/Index.ascx 

...and then the usual root view folders..

..che è il modello di sottodirectory che sarebbe cercare se pensava che fosse in una zona.

+0

Viene eseguito per impostazione predefinita in un'applicazione Web ASP.NET MVC 2 in VS2008. Fa parte dell'impostazione predefinita di global.asax – user314827

+0

Vedere la mia modifica .... –

+0

Ciao Robert, Ho ricontrollato tutti gli spazi dei nomi del mio controller. Sono tutti allineati con ciò che dovrebbero essere, ovvero ProjectName.Areas.AreaName.Controllers. – user314827

7

Risolto! Un paio di mie chiamate "RedirectToAction" non specificavano esplicitamente il nome dell'area nel parametro collection routeobject di quel metodo. Stranamente però, ciò è necessario anche se i controller Redirecting si trovano tutti nella stessa area. Inoltre, HtmlActionLinks funziona correttamente quando non specifica il nuovo {area = "blah"} nella sua raccolta routeobject, quindi mi chiedo il motivo per cui l'azione del controller chiama RedirectToAction(), anche se le azioni sia del chiamante sia del controller chiamato sono tutti all'interno della stessa area.

+3

Per favore segna questo come risposta. –

+0

Ho avuto un problema simile. Nel mio caso il mio collegamento non aveva il nome dell'area nel percorso e anche se è stato chiamato il controller corretto, la vista non è stata trovata. Questa situazione mi lascia la domanda su come il controller è stato chiamato. –

1

controllare il codice generato al MyArea AreaRegistration.cs e assicurarsi che il parametro di controllo è impostato il controller di default, in caso contrario il controller sarà chiamato bot per qualche motivo ASP.NET MVC non cercherà i punti di vista presso la cartella zona

public override void RegisterArea(AreaRegistrationContext context) 
    { 
     context.MapRoute(
      "SomeArea_default", 
      "SomeArea/{controller}/{action}/{id}", 
      new { controller = "SomeController", action = "Index", id = UrlParameter.Optional } 
     ); 
    } 
+0

Grazie! Questo lo ha risolto con uno scaffold ASP.NET MVC 5. –

1

ho appena avuto lo stesso problema e risolto impostando 'Build azione' proprietà del ascx a 'risorsa incorporata'.

1

Prova questo codice. Fare cambiamenti nella zona Registrazione file ...

context.MapRoute(
    "YourRouteName", // Route name // 
    "MyAreaName/MyController/{action}", // URL with parameters // 
    new { 
     controller = "MyControllerName", 
     action = "MyActionName", meetId = UrlParameter.Optional 
    }, // Parameter defaults 
    new[] { "Your Namespace name" } 
); 
6

Se si utilizza invece di

context.MapRoute(
     "xyz_default", 
     "xyz/{controller}/{action}/{id}", 
     new { action = "Index", id = UrlParameter.Optional } 

uso

context.MapRoute(
     "xyz_default", 
     "{controller}/{action}/{id}", 
     new { action = "Index", id = UrlParameter.Optional } 

nel vostro

xyzAreaRegistration.cs

poi non lo fai è necessario specificare esplicitamente la propria area in qualsiasi collegamento ...

+1

Questo tipo di ha funzionato per me ma con un altro problema. Il percorso sta colpendo il controller corretto ma la vista non è stata trovata (sta cercando nella directory principale del progetto per la vista predefinita invece che nell'area, che è ciò di cui ho bisogno). – JSideris

+0

@jSideris Sto avendo lo stesso problema. come hai risolto questo problema? –

1

Aggiungere l'attributo RouteArea sulla classe Controller in modo che MVC sappia utilizzare l'area "XYZ" per le viste (e quindi è possibile impostare l'AreaPrefix sulla stringa vuota in modo che i percorsi non debbano iniziare con "XYZ").

[RouteArea("Xyz", AreaPrefix = "")] 
public class XyzController : Controller 
{ 
... 
}