Подтвердить что ты не робот

Как реализовать пользовательский RazorViewEngine для поиска представлений в нестандартных местах?

Я ищу реализацию пользовательского RazorViewEngine. В основном у меня есть два сайта с фактически той же базой кода. Различия в том, что они выглядят иначе. Я хочу переопределить стандартный механизм просмотра, чтобы MVC выглядел в двух разных местах: для него были видны, макеты и т.д. Для компании A и для компании B. Компания A будет содержать основные виды, а представление компании B переопределит этих мастеров. Поэтому я хочу, чтобы механизм просмотра выглядел в местоположении B для представления, макета, основного или частичного, если он находит его, а затем возвращает его, если он не находит его. Я хочу, чтобы он по умолчанию отображался в представлении компании A по умолчанию. Очевидно, компания A будет смотреть только в своей собственной папке.

Хорошо, к сути вопроса: Я нашел этот сайт: http://www.aspnetwiki.com/mvc-3-razor:extending-the-view-engine

Первый вопрос, это лучший способ достичь этого?

Во-вторых, мне нужно переопределить методы CreatePartial, CreateView, FindPartial и FindView?

Обновление

Хорошо. Я сам выяснил второй вопрос: методы, которые я хочу переопределить, это CreateView и CreatePartialView, так как в этот момент он построил строку представления, и я могу с ней поиграть.

4b9b3361

Ответ 1

Хорошо, в конце я выбрал подход, подробно описанный здесь: http://weblogs.asp.net/imranbaloch/archive/2011/06/27/view-engine-with-dynamic-view-location.aspx

благодаря @Adriano для ответов и указателей, но в конце концов я думаю, что этот подход лучше всего соответствует моим потребностям. Подход, приведенный ниже, позволяет мне сохранить стандартную функциональность, но для создания нового местоположения представления более высокого приоритета для поиска.

public class Travel2ViewEngine : RazorViewEngine
{
    protected BrandNameEnum BrandName;
    private string[] _newAreaViewLocations = new string[] {
        "~/Areas/{2}/%1Views/{1}/{0}.cshtml",
        "~/Areas/{2}/%1Views/{1}/{0}.vbhtml",
        "~/Areas/{2}/%1Views//Shared/{0}.cshtml",
        "~/Areas/{2}/%1Views//Shared/{0}.vbhtml"
    };

    private string[] _newAreaMasterLocations = new string[] {
        "~/Areas/{2}/%1Views/{1}/{0}.cshtml",
        "~/Areas/{2}/%1Views/{1}/{0}.vbhtml",
        "~/Areas/{2}/%1Views/Shared/{0}.cshtml",
        "~/Areas/{2}/%1Views/Shared/{0}.vbhtml"
    };

    private string[] _newAreaPartialViewLocations = new string[] {
        "~/Areas/{2}/%1Views/{1}/{0}.cshtml",
        "~/Areas/{2}/%1Views/{1}/{0}.vbhtml",
        "~/Areas/{2}/%1Views/Shared/{0}.cshtml",
        "~/Areas/{2}/%1Views/Shared/{0}.vbhtml"
    };

    private string[] _newViewLocations = new string[] {
        "~/%1Views/{1}/{0}.cshtml",
        "~/%1Views/{1}/{0}.vbhtml",
        "~/%1Views/Shared/{0}.cshtml",
        "~/%1Views/Shared/{0}.vbhtml"
    };

    private string[] _newMasterLocations = new string[] {
        "~/%1Views/{1}/{0}.cshtml",
        "~/%1Views/{1}/{0}.vbhtml",
        "~/%1Views/Shared/{0}.cshtml",
        "~/%1Views/Shared/{0}.vbhtml"
    };

    private string[] _newPartialViewLocations = new string[] {
        "~/%1Views/{1}/{0}.cshtml",
        "~/%1Views/{1}/{0}.vbhtml",
        "~/%1Views/Shared/{0}.cshtml",
        "~/%1Views/Shared/{0}.vbhtml"
    };

    public Travel2ViewEngine()
        : base()
    {
        Enum.TryParse<BrandNameEnum>(Travel2.WebUI.Properties.Settings.Default.BrandName, out BrandName);

        AreaViewLocationFormats = AppendLocationFormats(_newAreaViewLocations, AreaViewLocationFormats);

        AreaMasterLocationFormats = AppendLocationFormats(_newAreaMasterLocations, AreaMasterLocationFormats);

        AreaPartialViewLocationFormats = AppendLocationFormats(_newAreaPartialViewLocations, AreaPartialViewLocationFormats);

        ViewLocationFormats = AppendLocationFormats(_newViewLocations, ViewLocationFormats);

        MasterLocationFormats = AppendLocationFormats(_newMasterLocations, MasterLocationFormats);

        PartialViewLocationFormats = AppendLocationFormats(_newPartialViewLocations, PartialViewLocationFormats);
    }

    private string[] AppendLocationFormats(string[] newLocations, string[] defaultLocations)
    {
        List<string> viewLocations = new List<string>();
        viewLocations.AddRange(newLocations);
        viewLocations.AddRange(defaultLocations);
        return viewLocations.ToArray();
    }

    protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath)
    {
        return base.CreateView(controllerContext, viewPath.Replace("%1", BrandName.ToString()), masterPath);
    }

    protected override IView CreatePartialView(ControllerContext controllerContext, string partialPath)
    {
        return base.CreatePartialView(controllerContext, partialPath.Replace("%1", BrandName.ToString()));
    }

    protected override bool FileExists(ControllerContext controllerContext, string virtualPath)
    {
        return base.FileExists(controllerContext, virtualPath.Replace("%1", BrandName.ToString()));
    }
}

затем зарегистрируйтесь в Gloabal.asax

protected void Application_Start(object sender, EventArgs e)
{
    RegisterRoutes(RouteTable.Routes);


    //Register our customer view engine to control T2 and TBag views and over ridding
    ViewEngines.Engines.Clear();
    ViewEngines.Engines.Add(new Travel2ViewEngine());
}

Ответ 2

Да, так, но вам не нужно переопределять эти методы. RazorViewEngine наследует от VirtualPathProviderViewEngine, чтобы вы могли использовать его свойства для определения местоположения своих просмотров.

В качестве примера прочитайте Создание своего первого MVC ViewEngine и Как установить маршрут по умолчанию ( Для области) в MVC.

Ответ 3

Вот мой ответ: Добавьте это в свой global.ascx

        ViewEngines.Engines.Clear();
        var customEngine = new RazorViewEngine();
        customEngine.PartialViewLocationFormats = new string[]
        {
            "~/Views/{1}/{0}.cshtml",
            "~/Views/Shared/{0}.cshtml",
            "~/Views/Partial/{0}.cshtml",
            "~/Views/Partial/{1}/{0}.cshtml"
        };



        customEngine.ViewLocationFormats = new string[]
        {
            "~/Views/{1}/{0}.cshtml",
            "~/Views/Shared/{0}.cshtml",
            "~/Views/Controller/{1}/{0}.cshtml"
        };

        customEngine.MasterLocationFormats = new string[]
        {
            "~/Views/Shared/{0}.cshtml",
            "~/Views/Layout/{0}.cshtml"
        };

        ViewEngines.Engines.Add(customEngine);

Это папки, в которых бритва проверяет ваши взгляды.

Сообщите мне, если это работает.