Widok lub jego wzorzec nie został znaleziony lub żaden silnik widoku nie obsługuje wyszukiwanych lokalizacji


80

Błąd taki jak: Widok „LoginRegister” lub jego główny nie został znaleziony lub żaden silnik widoku nie obsługuje wyszukiwanych lokalizacji. Przeszukano następujące lokalizacje:

~ / Views / MyAccount / LoginRegister.aspx

~ / Views / MyAccount / LoginRegister.ascx

~ / Views / Shared / LoginRegister.aspx

~ / Views / Shared / LoginRegister.ascx

~ / Views / MyAccount / LoginRegister.cshtml

~ / Views / MyAccount / LoginRegister.vbhtml

~ / Views / Shared / LoginRegister.cshtml

~ / Views / Shared / LoginRegister.vbhtml

Właściwie moja strona widoku strony jest ~/Views/home/LoginRegister.cshtmltym, co robię

i mój RouteConfigjest

 public class RouteConfig
    {

        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "MyAccount", action = "LoginRegister", id = UrlParameter.Optional }
            );
        }
    }

Przenieś widok LoginResiter do odpowiedniego folderu (dla kontrolera MyAccount).
Mansfield

Kontroler? Ale moja strona jest wyświetlona
user2564537

2
ASP.NET MVC oczekuje, że widoki dla określonego kontrolera będą znajdować się w folderze udostępnionym lub w folderze o nazwie kontrolera. Jak widać, szuka on folderu „Moje konto” i folderu „Udostępnione”. Jeśli chcesz użyć widoku w kontrolerze, powinieneś umieścić go w folderze o tej nazwie kontrolera. Nie ma to nic wspólnego z konfiguracją trasy.
Mansfield,

8
Otrzymałem ten błąd po opublikowaniu witryny na innym komputerze. Okazało się, że akcja kompilacji w widoku została ustawiona na Nonezamiast Contentprzełączania ich i ponownego publikowania (lub po prostu kopiowania pliku) działało.
Patrick

Odpowiedzi:


108

Uważaj, jeśli typ Twojego modelu to String, ponieważ drugi parametr View (string, string) to masterName, a nie model . Może być konieczne wywołanie przeciążenia z obiektem (modelem) jako drugim parametrem:

Niepoprawne :

protected ActionResult ShowMessageResult(string msg)
{
    return View("Message",msg);
}

Poprawnie:

protected ActionResult ShowMessageResult(string msg)
{
    return View("Message",(object)msg);
}

LUB (dostarczone przez bradlis7):

protected ActionResult ShowMessageResult(string msg)
{
    return View("Message",model:msg);
}

16
Zamiast rzutowania (object)msg, podaj argument jawnie:return View("Message", model: msg);
bradlis7

1
To świetna odpowiedź
JsonStatham

31

Problem:

Twojego Viewnie można znaleźć w domyślnych lokalizacjach.

Wyjaśnienie:

Widoki powinny znajdować się w tym samym folderze o nazwie co folder Controllerlub w Sharedfolderze.

Rozwiązanie:

Przenieś swój Viewdo MyAccountfolderu lub utwórz plik HomeController.

Alternatywy:

Jeśli nie chcesz przenosić Viewlub tworzyć nowych, Controllermożesz to sprawdzić pod tym linkiem .


3
Dodatkowo, jeśli masz ten problem, który znalazłem, najlepiej po prostu usunąć swój widok. (skopiuj jego zawartość do notepadd ++) Przejdź do kontrolera, a następnie kliknij prawym przyciskiem myszy wynik działania i wybierz widok generowania, a następnie możesz zobaczyć, gdzie kontroler szukał Twojego widoku i odpowiednio umieścić widoki.
Bill Blankenship,

14

W Microsoft ASP.net MVC aparat routingu, który jest używany do analizowania przychodzących i wychodzących kombinacji adresów URL, został zaprojektowany zgodnie z ideą Konwencji zamiast konfiguracji. Oznacza to, że jeśli postępujesz zgodnie z Konwencją (regułami) używanymi przez silnik routingu, nie musisz zmieniać konfiguracji.

Silnik routingu dla ASP.net MVC nie obsługuje stron internetowych (.cshtml). Zapewnia sposób obsługi adresu URL przez klasę w kodzie, która może renderować tekst / html do strumienia wyjściowego lub analizować i obsługiwać pliki .cshtml w spójny sposób przy użyciu Konwencji.

Konwencja używana do routingu polega na dopasowaniu kontrolera do klasy o nazwie podobnej do ControllerNameControllernp. controller="MyAccount"Oznacza znajdź klasę o nazwie MyAccountController. Następnie następuje akcja, która jest odwzorowywana na funkcję w klasie kontrolera, która zwykle zwraca plik ActionResult. ie action="LoginRegister"będzie szukać funkcji public ActionResult LoginRegister(){}w klasie kontrolera. Ta funkcja może zwrócić plik, View()który według Konwencji LoginRegister.cshtmlmiałby nazwę i byłby przechowywany w /Views/MyAccount/folderze.

Podsumowując, miałbyś następujący kod:

/Controllers/MyAccountController.cs:

public class MyAccountController : Controller 
{
    public ActionResult LoginRegister()
    {
        return View();
    }
}

/Views/MyAccount/LoginRegister.cshtml: Twój plik widoku.


8

W akcji LoginRegister podczas zwracania widoku wykonaj poniższe czynności, wiem, że można to zrobić w mvc 5, nie jestem pewien, czy w mvc 4 również.

 public ActionResult Index()
 {
     return View("~/Views/home/LoginRegister.cshtml");
 }

5

Sprawdź akcję kompilacji swojego widoku (plik .cshtml). Powinna być ustawiona na zawartość. W niektórych przypadkach zauważyłem, że akcja kompilacji została ustawiona na Brak (przez pomyłkę) i ten konkretny widok nie został wdrożony na komputerze docelowym, mimo że widzisz ten widok w pliku projektu programu Visual Studio w prawidłowym folderze


1
W moim przypadku było to również związane z właściwością „Build Action”, ale musiałem ustawić ją na „Embedded Resource”
Ali Tahouri

3

Może to być problem z uprawnieniami.

Ostatnio miałem ten sam problem. W ramach testu utworzyłem prostą stronę hello.html. Kiedy próbowałem go załadować, otrzymałem komunikat o błędzie dotyczący uprawnień. Po rozwiązaniu problemu z uprawnieniami w głównym folderze sieciowym, zarówno strona html, jak i problemy z renderowaniem MVC zostały rozwiązane.


W moim przypadku był to również kwestia uprawnienia pozwolił uwierzytelnionym użytkownikom dostęp do folderu głównego aplikacji i usunięcie tylko do odczytu flaga stała się kwestią
Momin

2

Sprawdź, czy utworzony widok (plik .ASPX) ma taką samą nazwę, jak nazwa wymieniona w kontrolerze. Na przykład:

 public ActionResult GetView()
 {
    return View("MyView");
 }

W takim przypadku plik aspx powinien mieć nazwę MyView.aspx zamiast GetView.aspx


2

Otrzymałem ten błąd, ponieważ zmieniłem nazwę mojego widoku (i akcji POST).

W końcu stwierdziłem, że zapomniałem zmienić nazwy ZARÓWNO GET, jak i POST na nową.

Rozwiązanie : zmień nazwy akcji GET i POST, aby były zgodne z nazwą widoku.


1

Jeśli problem pojawia się sporadycznie podczas produkcji, może to być spowodowane przerwaniem metody działania. Na przykład, podczas operacji POST obejmującej przesyłanie dużego pliku, użytkownik zamyka okno przeglądarki przed zakończeniem przesyłania. W takim przypadku metoda akcji może zgłosić zerowy wyjątek odwołania wynikający z zerowego modelu lub obiektu widoku. Rozwiązaniem byłoby zawinięcie treści metody w try / catch i zwrócenie wartości null. Lubię to:

[HttpPost]
public ActionResult Post(...)
{
    try
    {
        ...
    }
    catch (NullReferenceException ex)  // could happen if POST is interrupted
    {
        // perhaps log a warning here
        return null;
    }

    return View(model);
}

1

Miałem ten sam problem. Skopiowałem widok „Film” i odpowiednio zmieniłem jego nazwę na „Klient”. Zrobiłem to samo z modelami i kontrolerami.

Rozwiązanie było następujące ... Zmieniłem nazwę Widoku Klienta na Klient1 i właśnie utworzyłem nowy widok i nazwałem go Klientem .... Po prostu skopiowałem kod Klienta1 do Klienta.

To zadziałało.

Bardzo chciałbym poznać prawdziwą przyczynę problemu.

AKTUALIZACJA Tylko dla uśmiechów .... Wróciłem i ponownie odtworzyłem cały scenariusz zmiany nazwy ... i nie dostałem żadnych błędów.


0

Jeśli zaznaczyłeś wszystkie rzeczy z powyższych odpowiedzi (które są typowymi błędami) i masz pewność, że Twój widok znajduje się w lokalizacji w wyjątkach, może być konieczne ponowne uruchomienie programu Visual Studio.

:(


0

W moim przypadku musiałem użyć RedirectToAction, aby rozwiązać problem.

[HttpGet]
[ControleDeAcessoAuthorize("Report/ExportToPDF")]
public ActionResult ExportToPDF(int id, string month, string output)
{
    try
    {
        // Validate
        if (output != "PDF")
        {
            throw new Exception("Invalid output.");
        }
        else
        {
            ...// code to generate report in PDF format
        }
    }
    catch (Exception ex)
    {
        return RedirectToAction("Error");
    }
}

[ControleDeAcessoAuthorize("Report/Error")]
public ActionResult Error()
{
    return View();
}

0

Wpadłem na to jakiś czas temu i doprowadziło mnie to do szału, ponieważ okazało się to proste. Tak więc w moim widoku korzystałem z kontroli sieci, która uzyskiwała dane dla sieci za pośrednictwem żądania http. Gdy środkowa warstwa zakończyła moje żądanie i zwróciła zestaw danych, otrzymałem ten sam błąd. Okazuje się, że moje oświadczenie zwrotne brzmiało „widok powrotu (zestaw danych)”; zamiast 'return Json (dataset);


0

Natrafiłem na ten błąd z powodu niewłaściwego zamknięcia oświadczenia,

@using (Html.BeginForm ("DeleteSelected", "Employee", FormMethod.Post))

{

} // Ten nawias klamrowy musiał być zamknięty na końcu.

W pliku widoku Index.cshtml nie zamknąłem instrukcji na końcu programu. zamiast tego zakończyłem niepoprawne zamknięcie i napotkałem ten błąd.

Byłem pewien, że nie ma potrzeby sprawdzania kodu kontrolera ActionMethod, ponieważ poprawnie zwróciłem metodę kontrolera do widoku. Więc to musi być widok, który nie odpowiada i spotkał się z podobnym błędem.


0

Nie mogłem znaleźć rozwiązania tego problemu, dopóki nie dowiedziałem się, że pliki nie istnieją! Zajęło mi to dużo czasu, ponieważ Eksplorator rozwiązań pokazuje pliki!

wprowadź opis obrazu tutaj

Ale kiedy klikam plik Index.cshtml, pojawia się ten błąd:

wprowadź opis obrazu tutaj

To był powód, dla którego pojawił się ten błąd. Mam nadzieję, że ta odpowiedź komuś pomoże.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.