2009-11-25 7 views
1

Quand la propriété MasterPageFile d'une vue/page est-elle vérifiée dans le moteur de vue ASP.NET MVC WebForms?Quand le fichier MasterPageFile est-il situé dans ASP.NET MVC WebForms ViewEngine

Ce que je veux faire est d'avoir le code suivant ne sort pas l'erreur:

Parser Error Message: The file '/SomePlaceThatDosentExist/Site.Master' does not exist.

au sens défini dans le fichier .aspx de mon avis:

<%@ Page Language="C#" MasterPageFile="~/SomePlaceThatDosentExist/Site.Master" Inherits="System.Web.Mvc.ViewPage" > 

Où aurais-je besoin d'écrire quelques-uns code pour entrer et définir une propriété MasterPageFile valide?

J'ai essayé ce qui suit dans ma classe de ViewPage personnalisée que mes vues hériteront

public override string MasterPageFile 
    { 
     get 
     { 
      return base.MasterPageFile; 
     } 
     set 
     { 
      base.MasterPageFile = "~/RealPlace/Site.Master"; 
     } 
    } 

et ont essayé également ce qui suit (dans une vue personnalisée classe de page que mon point de vue hériteront)

protected override void OnPreInit(EventArgs e) 
    { 
     base.MasterPageFile = "~/RealPlace/Site.Master"; 
     base.OnPreInit(e); 
    } 

En Dans les deux cas, l'erreur indiquée ci-dessus est affichée. D'après ce que je sais, OnPreInit est le premier point dans le cycle de vie d'un ViewPage, est-il possible d'aller encore plus tôt dans le cycle de vie?

Remarque avant de vous écrire et réponse:

  • Je sais à propos de Vue de retour ("ViewName", "MasterPageName");
  • Je sais sur les pages maîtres dynamiques, mais je veux accomplir cette tâche spécifique

Répondre

2

Votre meilleur parier pour résoudre le problème est probablement de créer une coutume VirtualPathProvider

+0

Merci cela a fonctionné. J'ai eu mon fournisseur de chemin virtuel juste remplacer toute occurrence de "SomePlace" avec "RealPlace" dans toutes les méthodes over-ridable nécessaires (GetFile, FileExists, GetDirectory, DirectoryExists, CombineVirtualPaths) – Omar

-1

Si vous voulez changer la façon dont un masterpage se trouve que vous pouvez mettre en œuvre votre propre ViewEngine:

public CustomViewEngine() 
{ 
    MasterLocationFormats = new string[] { 
     "~/RealPlace/Site.Master"" 
    }; 
} 
+0

Ce code ne s'applique-t-il pas uniquement pour return View ("ViewName", "MasterPageName") ;? Cela ne sera-t-il pas ignoré si le fichier .aspx a déjà une directive MasterPageFile @ Page déclarée? – Omar

+0

Oui, vous devez utiliser View ("ViewName", "MasterPageName"). Je ne suis pas sûr si l'aspx ne peut pas avoir sa propre directive @Page. –

+0

Je ne souhaite pas utiliser View ("ViewName", "MasterPageName"), je souhaite que la page maître soit chargée à partir de la directive @Page de la vue. – Omar