11 Stimmen

MVC 3 sucht nicht nach Ansichten unter Bereichen.

Ich verwende mehrere Bereiche in MVC 3 und habe Probleme damit, dass meine Ansichten nicht gefunden werden. Die Routing-Funktion scheint meine Controller richtig zu erkennen (alle Aktionen werden ohne Probleme ausgeführt), aber wenn ich eine Ansicht zurückgebe, findet MVC sie einfach nicht.

Also, wenn ich einen einfachen Controller namens 'Thing' in einem Bereich namens 'Some' habe und folgendes mache...

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

Die Aktion wird korrekt ausgeführt, aber MVC findet die Ansicht nicht und ich erhalte eine Meldung wie beispielsweise

Die Ansicht 'Index' oder ihr Master wurde nicht gefunden... Und es zeigt mir alle durchsuchten Orte an, die sein werden

~/Views/Thing/Index.cshtml ~/Views/Shared/Index.cshtml

usw., aber es sucht nicht in

~/Some/Views/Thing/Index.cshtml

Irgendwelche Ideen, was ich falsch mache?

0 Stimmen

Hast du deine Bereichsregistrierungsdateien an den richtigen Stellen?

0 Stimmen

Hast du versucht, es ohne viewname zu testen? Standardmäßig wird der Name der Aktionmethode als viewname verwendet. return View();

17voto

Jaco Pretorius Punkte 24562

Ok, tut mir leid, dass ich meine eigene Frage beantworten muss, aber niemand hat mir wirklich die Antwort gegeben, nach der ich gesucht habe. Es scheint, dass mein Problem mit benutzerdefiniertem Routing war.

Um das Problem neu zu erstellen, habe ich ein leeres MVC 3-Projekt erstellt und einen Bereich namens 'Some' hinzugefügt und einen Controller in diesem Bereich namens 'Thing'. Unter Thing habe ich eine Index-Aktion erstellt, die einfach eine Ansicht zurückgibt. Dann habe ich die Index-Ansicht zu ~/Areas/Some/Views/Thing/Index.cshtml hinzugefügt

Super. Wenn ich also /Some/Thing/Index aufrufe, wird die Ansicht richtig zurückgegeben.

Jetzt füge eine Route zu Global.asax hinzu, die so aussieht:

routes.MapRoute(
                "Custom", // Routenname
                "Bob", // URL mit Parametern
                new { area = "Some", controller = "Thing", action = "Index" }
                );

Wenn ich jetzt zu /Bob navigiere, erhalte ich den Fehler, den ich erwähnt habe - MVC findet die Ansicht nicht. Um dieses Problem zu beheben, musste ich diese Route in der SomeAreaRegistration-Klasse registrieren, anstatt in Global.asax. Ich brauchte auch nicht die 'area'-Eigenschaft, also sieht es so aus.

    context.MapRoute(
        "Custom", // Routenname
        "Bob", // URL mit Parametern
        new { controller = "Thing", action = "Index" }
        );

4voto

Despertar Punkte 20373

Wenn Ihr Controller den gleichen Namen wie das Gebiet hat, wird Ihr Controller durch die Standard-Basisroute {controller}/{action} BEVOR es die Gebietsroute überprüft und wird daher nach der Ansicht im Stammverzeichnis /views suchen anstelle von in der Bereich /views. Das Umbenennen des Gebiets oder des Controllers wird dieses Problem lösen.

1voto

Yaroslav Bigus Punkte 670

Versuchen Sie, die folgende Route in der global.asax hinzuzufügen:

 context.MapRoute(
                "default",
                "Einige/{controller}/{action}/",
                new { controller = "Ding", action = "Index"}
            );

1voto

Rodrigo Caballero Punkte 1050

Stelle sicher, dass du eine Datei namens SomeAreaRegistration.cs in deinem "Some" Bereich hast. Diese Datei sollte etwas Ähnliches wie folgt enthalten:

public class SomeAreaRegistration : AreaRegistration
{
    public override string AreaName
    {
        get
        {
            return "Some";
        }
    }

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "Some_default",
            "Some/{controller}/{action}/{id}",
            new { action = "Index", id = UrlParameter.Optional }
        );
    }
}

1voto

Chaim Zonnenberg Punkte 1755

Wenn Sie Bereiche verwenden, platzieren Sie Ihre index.cshtml im Verzeichnis ~/Areas/Some/Views/Thing/Index.cshtml

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X