2010-04-12 11 views
12

Mam projekt korzystający z obszarów MVC. Obszar zawiera cały projekt, podczas gdy główne foldery "Widoki/Kontrolery/Modele" poza obszarami są puste, z pominięciem kontrolera dyspozytorskiego, który skonfigurowałem, który kieruje domyślne przychodzące żądania do kontrolera domowego w moim obszarze.Obszary MVC - Nie znaleziono widoku

Sterownik ten ma jeden sposób następujący: -

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

Mam też konfigurację domyślną trasę do korzystania z tego kontrolera w następujący sposób: -

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

Wszelkie wnioski domyślnych do mojej strony są odpowiednio kierowane do odpowiedniego obszaru. Metoda "RegisterArea" w obszarze ma jedną trasę: -

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

Mój obszar ma wielu kontrolerów z wieloma widokami. Każde wywołanie określonego widoku w tych metodach kontrolera, takich jak "return View (" blah "); , renderuje poprawny widok, ale gdy tylko spróbuję i zwróci widok wraz z obiektem modelu przekazanym jako parametr, otrzymam następujący błąd: : -.

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 

wygląda na to, gdy obiekt model jest przekazywana jako param do "View()" metoda [np powrócić View ("bla", obj)] wyszukuje widoku w katalog główny projektu zamiast w folderze widoku określonego obszaru:

Czego mi tu brakuje?

Z góry dzięki.

Odpowiedz

3

Jeśli jest to problem z routingiem, możesz go naprawić, rejestrując trasy lokalne najpierw. To powoduje, że silnik routingu, aby spróbować dopasowanie jedną z dróg strefy, przed dopasowanie trasy root:

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

Jeśli wymusić błąd przez zmianę nazwy jednego z moich poglądów foldery w mojej aplikacji obszarów, mam inny błąd niż twoja:

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..

..which jest wzór podkatalogów byłoby wyszukiwania, jeśli to, że to było w okolicy.

+0

Jest to robione domyślnie w aplikacji sieci web ASP.NET MVC 2 w VS2008. Jest częścią konfiguracji domyślnej global.asax – user314827

+0

zobaczyć moje zmienił .... –

+0

Cześć Robert, I ponownie sprawdzano wszystkie moje nazw kontrolerów. Wszystkie są zgodne z tym, czym powinny być, czyli ProjectName.Areas.AreaName.Controllers. – user314827

7

Rozwiązany! Kilka moich wywołań "RedirectToAction" nie określało jawnie nazwy obszaru w parametrze kolekcji targetobject tej metody. Dziwne jednak, że jest to wymagane, mimo że przekierowania kontrolerów znajdują się w tym samym obszarze. Ponadto, HtmlActionLinks działa dobrze, gdy nie określam nowego {area = "bla"} w jego kolekcji routeobiektu, więc zastanawiam się, dlaczego akcja kontrolera wywołuje funkcję RedirectToAction(), mimo że zarówno wywołujące, jak i wywołane akcje kontrolera wszystkie znajdują się w tym samym obszarze.

+3

Proszę oznaczyć to jako odpowiedź. –

+0

Miałem podobny problem. W moim przypadku mój link nie zawierał nazwy obszaru na ścieżce i pomimo tego, że został wywołany właściwy kontroler, nie można znaleźć widoku. Sytuacja ta pozostawia mi pytanie, w jaki sposób został wezwany kontroler. –

1

Sprawdź wygenerowanego kodu na MyArea AreaRegistration.cs i upewnić się, że parametr jest ustawiony kontroler do domyślnego sterownika, w przeciwnym razie będzie kontroler o nazwie bot jakiegoś powodu ASP.NET MVC nie szuka poglądów w folderze obszarowym

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

Dzięki! Naprawiono to dla mnie z rusztowaniem ASP.NET MVC 5. –

1

Po prostu miałem ten sam problem i rozwiązałem go, ustawiając właściwość 'Build Action' ascx na 'Embedded Resource'.

1

Spróbuj tego kodu. Czy zmiany w obszarze rejestracji pliku ...

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

Jeśli używasz zamiast

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

użytku

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

w

xyzAreaRegistration.cs

wtedy nie musisz wyraźnie określić swój obszar w dowolnym łączu ...

+1

Ten rodzaj pracował dla mnie, ale z innym problemem. Trasa uderza w prawidłowy kontroler, ale widok nie został znaleziony (szuka w głównym katalogu projektu domyślnego widoku zamiast w obszarze, który jest tym, czego potrzebuję). – JSideris

+0

@jSideris Mam ten sam problem. w jaki sposób rozwiązałeś ten problem? –

1

Dodaj atrybut RouteArea w klasie Controller, aby MVC wiedział, że do wyświetlania widoków należy używać obszaru "XYZ" (a następnie możesz ustawić parametr AreaPrefix na pusty ciąg znaków, aby trasy nie musiały zaczynać się od "XYZ").

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