Question

Actuellement, je développe sur une ancienne application ASP.NET MVC 1, pour ajouter une prise en charge du thème. J'ai regardé autour du Web et j'ai pu construire mon propre ViewEngine qui fonctionne bien jusqu'à présent. Un seul problème consiste à me frapper.

J'ai écrasé la méthode suivante pour WebFormViewEngine:

public override ViewEngineResult FindView(
    ControllerContext controllerContext, 
    string viewName, 
    string masterName, 
    bool useCache)

Dans cette méthode, je configure les formats de localisation pour la prise en charge du thème. Malheureusement, le paramètre MasterName est toujours vide! J'ai donc besoin de vérifier

if (string.IsNullOrEmpty(masterName))    
    masterName = "Site";

Toujours seul pour faire fonctionner le moteur. Mais comme j'ai plusieurs fichiers maître, cette solution est nul, dès qu'une vue nécessite un autre maître que "site". Est-ce que quelqu'un sait comment obtenir le nom des vues Master Views dans cette méthode?

Était-ce utile?

La solution

Je l'ai résolu par moi-même. Après beaucoup de recherches, j'ai trouvé après l'extrait, ce qui m'a aidé:

private void RenderViewPage(ViewContext context, ViewPage page)
            {
                if (!String.IsNullOrEmpty(MasterPath)) {
                    page.MasterLocation = MasterPath;
                } else {
                    if (sc.WIP.CarharttIMD.Common.Config.GetStringValue("Theme") != "Default")
                        page.PreInit += new EventHandler(page_PreInit);
                }

                page.ViewData = context.ViewData;
                page.RenderView(context);
            }

void page_PreInit(object sender, EventArgs e)
            {
                ViewPage page = sender as ViewPage;
                //test for Default theme path, and replace with current theme
                string defaultthemepath = string.Format("{0}Content/Default", page.Request.ApplicationPath);
                if (!string.IsNullOrEmpty(page.MasterPageFile) && !page.MasterPageFile.ToLower().StartsWith(defaultthemepath.ToLower()))
                {
                    string masterPagePath = page.MasterPageFile;
                    int lastIndexOfSlash = masterPagePath.LastIndexOf('/');
                    string masterPageName = masterPagePath.Substring(lastIndexOfSlash + 1, masterPagePath.Length - lastIndexOfSlash - 1);
                    string newMaster = string.Format(
                        "~/Content/{0}/Views/Shared/{1}",
                        Common.Config.GetStringValue("Theme"),
                        masterPageName
                    );
                    if (File.Exists(page.Server.MapPath(newMaster)))
                        page.MasterLocation = newMaster;
                }
            }

J'ai dû sous-classer le WebViewForm et Harenage le fichier maître dans l'événement Preinit.

Autres conseils

Résolution du même problème, mais l'approche était peu différente.

Supposons que vous ayez une arborescence alternative dans le dossier du thème, alors vous devez définir dans votre classe MyViewEngine dérivée de WebFormViewEngine:

base.MasterLocationFormats =  new[] {
                        "~/Theme/Views/{1}/{0}.master", 
                        "~/Theme/Views/Shared/{0}.master"
                    }
                ).ToArray();

base.ViewLocationFormats = viewLocationFormats.Concat(
                    new[] {
                        "~/Theme/Views/{1}/{0}.aspx", 
                        "~/Theme/Views/Shared/{0}.aspx", 
                    }
                ).ToArray()

et méthode de remplacement:

protected override bool FileExists(ControllerContext controllerContext, string virtualPath)
{
    return System.IO.File.Exists(controllerContext.HttpContext.Server.MapPath(virtualPath));
}

Dans l'application_start Méthode de Global.asax.cs Fichier Ajouter:

System.Web.Mvc.ViewEngines.Engines.Clear();
System.Web.Mvc.ViewEngines.Engines.Add(new WebFormThemeViewEngine());

Alternativement, vous pourriez probablement utiliser certaines des techniques que j'ai décrites dans cette réponse: Comment changer les thèmes dans ASP.NET MVC 2

C'est sur MVC3 et Razor, mais tout sauf la vue devrait également fonctionner très bien sur MVC 1.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top