Mam następujący układ dla mojego projektu MVC:
- / Kontrolery
- /Próbny
- / Demo / DemoArea1Controller
- / Demo / DemoArea2Controller
- itp...
- /Wyświetlenia
- /Próbny
- /Demo/DemoArea1/Index.aspx
- /Demo/DemoArea2/Index.aspx
Jednak gdy mam to na DemoArea1Controller
:
public class DemoArea1Controller : Controller
{
public ActionResult Index()
{
return View();
}
}
Otrzymuję błąd „Nie można znaleźć indeksu widoku lub jego wzorca” przy zwykłych lokalizacjach wyszukiwania.
Jak mogę określić te kontrolery w obszarze wyszukiwania „Demo” w podfolderze widoku „Demo”?
asp.net-mvc
views
Daniel Schaffer
źródło
źródło
Odpowiedzi:
Możesz łatwo rozszerzyć WebFormViewEngine, aby określić wszystkie lokalizacje, w których chcesz szukać:
Pamiętaj, aby zarejestrować mechanizm widoku, modyfikując metodę Application_Start w pliku Global.asax.cs
źródło
Teraz w MVC 6 możesz zaimplementować
IViewLocationExpander
interfejs bez mieszania się z silnikami widoku:gdzie
{0}
jest nazwa widoku docelowego,{1}
- nazwa kontrolera i{2}
- nazwa obszaru.Możesz zwrócić własną listę lokalizacji, połączyć ją z domyślnymi
viewLocations
(.Union(viewLocations)
) lub po prostu je zmienić (viewLocations.Select(path => "/AnotherPath" + path)
).Aby zarejestrować niestandardowy ekspander lokalizacji widoku w MVC, dodaj kolejne wiersze do
ConfigureServices
metody wStartup.cs
pliku:źródło
W rzeczywistości jest o wiele łatwiejsza metoda niż zakodowanie ścieżek w konstruktorze. Poniżej znajduje się przykład rozszerzenia silnika Razor w celu dodania nowych ścieżek. Nie jestem do końca pewien, czy ścieżki, które tu dodasz, zostaną zapisane w pamięci podręcznej:
A Twój Global.asax.cs
Jedna uwaga: Twoja niestandardowa lokalizacja będzie wymagała pliku ViewStart.cshtml w swoim katalogu głównym.
źródło
Jeśli chcesz po prostu dodać nowe ścieżki, możesz dodać do domyślnych silników widoku i zaoszczędzić kilka linii kodu:
To samo dotyczy
WebFormEngine
źródło
Zamiast podklasy RazorViewEngine lub zastępowania jej wprost, możesz po prostu zmienić istniejącą właściwość PartialViewLocationFormats na istniejącą RazorViewEngine. Ten kod znajduje się w Application_Start:
źródło
Ostatnio sprawdzałem, wymaga to zbudowania własnego ViewEngine. Nie wiem jednak, czy ułatwili to w RC1.
Podstawowym podejściem, które zastosowałem przed pierwszym RC, było podzielenie przestrzeni nazw kontrolera w moim własnym ViewEngine i wyszukanie folderów pasujących do części.
EDYTOWAĆ:
Wróciłem i znalazłem kod. Oto ogólny pomysł.
źródło
Spróbuj czegoś takiego:
źródło
Uwaga: w przypadku ASP.NET MVC 2 mają one dodatkowe ścieżki lokalizacji, które należy ustawić dla widoków w obszarze „Obszary”.
Tworzenie mechanizmu przeglądania dla obszaru jest opisane na blogu Phila .
Uwaga: dotyczy wersji zapoznawczej 1, więc może ulec zmianie.
źródło
Większość odpowiedzi tutaj, wyczyść istniejące lokalizacje , dzwoniąc,
ViewEngines.Engines.Clear()
a następnie dodaj je ponownie ... nie ma potrzeby tego robić.Możemy po prostu dodać nowe lokalizacje do istniejących, jak pokazano poniżej:
Teraz możesz skonfigurować swój projekt, aby używał powyższego
RazorViewEngine
w Global.asax:Więcej informacji znajdziesz w tym poradniku .
źródło