Поддержка тем для ASP.NET MVC 1, получение имени мастера вида - PullRequest
1 голос
/ 29 марта 2011

В настоящее время я работаю над старым приложением ASP.NET MVC 1, чтобы добавить поддержку тем. Я посмотрел в Интернете и смог создать свой собственный ViewEngine, который пока работает довольно хорошо. Только одна проблема бьет меня.

Я переписал следующий метод для WebFormViewEngine:

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

В этом методе я настраиваю форматы местоположения для поддержки темы. К сожалению, параметр masterName всегда пуст! Так что мне нужно проверить

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

всегда один, чтобы двигатель работал. Но так как у меня есть несколько основных файлов, это решение отстой, как только представление требует другого мастера, чем «Сайт». Кто-нибудь знает, как я могу получить имя основного вида в этом методе?

Ответы [ 3 ]

2 голосов
/ 31 марта 2011

Решил сам. После долгих исследований я нашел следующий фрагмент, который мне помог:

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;
                }
            }

Пришлось создать подкласс WebViewForm и обработать основной файл в событии PreInit.

1 голос
/ 31 марта 2011

В качестве альтернативы, вы могли бы использовать некоторые методы, которые я описал в этом ответе: как изменить темы в asp.net mvc 2

Это на MVC3 и Razor, но все, кроме View, должно прекрасно работать и на MVC 1.

1 голос
/ 29 марта 2011

Решил вид той же проблемы, но подход был немного другим.

Предположим, у вас есть дерево альтернативных представлений в папке Theme, а затем вы должны установить в своем классе MyViewEngine, производный от 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()

и метод переопределения:

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

В методе Application_Start из файла Global.asax.cs добавьте:

System.Web.Mvc.ViewEngines.Engines.Clear();
System.Web.Mvc.ViewEngines.Engines.Add(new WebFormThemeViewEngine());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...