Как реализовать пользовательский RazorViewEngine для поиска представлений в нестандартных местах? - PullRequest
21 голосов
/ 23 марта 2012

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

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

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

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

Обновление

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

Ответы [ 3 ]

17 голосов
/ 23 марта 2012

Хорошо, в конце концов, я выбрал подход, подробно описанный здесь: 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());
}
7 голосов
/ 23 марта 2012

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

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

1 голос
/ 21 марта 2017

Вот мой ответ: Добавьте это в ваш 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);

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

Дайте мне знать, если это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...