Warum ruft MVC 5 die GetFile-Methode meiner VirtualPathProvider-Klasse nicht auf?

8

Ich versuche Razor View aus der Datenbank zu laden.

Ich folge ASP.NET MVC und virtuellen Ansichten und VirtualPathProvider in MVC 5 , um das zu tun.

mein Code:

VirtualPathProvider:

%Vor%

VirtualFile

%Vor%

Global.asax:

%Vor%

Aktion:

%Vor%

Daten:

Fall 1:

Wenn der Wert von virtualPath "/ Views / Home / Contact.cshtml" lautet, gibt die FileExists-Methode true zurück und die Methode GetFile heißt .

Fall 2:

Wenn der virtualPath-Wert "~ / Home / Display / ce28bbb6-03cb-4bf4-8820-373890396a90" ist, gibt die FileExists-Methode true und GetFile-Methode und zurück Anzeige Aktion wird nie aufgerufen. und das Ergebnis ist

HTTP-Fehler 404.0 - Nicht gefunden Die Ressource, nach der Sie suchen, wurde entfernt, der Name wurde geändert oder ist vorübergehend nicht verfügbar.

Ich habe keine Ahnung von dynamischer Sicht. Ich lese gerade diesen zwei Artikel und versuche ihn zu implementieren.

Bitte sagen Sie mir, wo ich falsch liege.

Ich verwende MVC 5 und .NET 4.5

    
Md.Hasanuzzaman 19.07.2014, 18:41
quelle

3 Antworten

5

etwas, bei dem ich Ihnen helfen könnte. Es gibt etwas, worüber du nicht nachdenkst, was in Ordnung ist, denn ich hatte auch eine Menge Probleme damit.

Ich denke, das Problem, das Sie hier haben, ist zu wissen, in welcher Reihenfolge alles feuert. Das passiert:

  1. Zuerst wird die Methode VirtualPathProvider FileExists aufgerufen und Hier machen Sie Ihre Magie, um die Seite zu finden. Meine Methoden unterscheiden sich geringfügig von Ihren, hier ein Beispiel:

    %Vor%
  2. Nun, wenn diese Seite von der Datenbank bedient wird, ist es eine virtuelle Seite. Das nächste, was passiert, ist, dass sie Ihren MvcHandler aufruft (in meinem Handler habe ich diese Funktionen)

    %Vor%
  3. Nur für den Fall, dass Sie Ihren MvcHandler erstellen, falls Sie dies noch nicht getan haben, muss er in RouteConfig wie folgt registriert werden:

    %Vor%
  4. In meinem MvcHandler erhalte ich meine Seite. Wenn sie mit einer virtuellen Seite übereinstimmt, gehe ich zu einem RoutingController

    %Vor%

nur für dich, ich werde die service.View Methode

zeigen %Vor%
  1. Dann werden wir zurück zu unserem VirtualPathProvider gebracht und der Prozess beginnt erneut, aber dieses Mal sieht der virtuelle Pfad ungefähr so ​​aus: "~ / Views / Routing / 1331.aspx"
  2. Wenn Sie bemerken, sucht meine FindPage -Methode auch nach einer Erweiterungsübereinstimmung, die ich ebenfalls in der Datenbank abspeichere:
  3. Dann wird GetFile aufgerufen und solange Sie meinen Pfad befolgt haben, sollten Sie VirtualFile zurückgeben

Ich hoffe wirklich, dass das hilft:)

    
r3plica 23.09.2014, 23:46
quelle
3

Ich habe dasselbe Problem. Razor View Engine ruft GetFile nicht auf, wenn Sie VirtualPath nicht im * .cshtml-Format haben. Sie müssen {Guid} .cshtml Pfadformat erzeugen

    
ZOXEXIVO 14.11.2014 12:29
quelle
0

WARNUNG: ASP.NET 4 (MVC5) relativ!

Trotz der Anzahl der Antworten und einer ausgewählten, werde ich meine Erfahrung teilen.

%Vor%

wird zweimal aufgerufen, einmal mit einem app-relativen Pfad ("~ / bla-bla") und noch einmal mit absolutem ("/ bla-bla"). In meinem Fall versagt der zweite (der abs. Pfad). Scheint wie in ASP.NET 3 war das OK, aber ASP.NET 4 (MVC5) überprüft es auch. Und erfordert, dass true zurückgegeben wird. Als Ergebnis

%Vor%

wird nicht aufgerufen.

Für diejenigen, die ein solches Verhalten implementieren müssen, bietet VirtualPathUtility die Methoden ToAbsolute und ToAppRelative comfort an.

HTH

    
Alexander Christov 24.06.2016 13:05
quelle

Tags und Links