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

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

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

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

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

Обновить

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

Хорошо, в конце концов я выбрал подход, подробно описанный здесь: 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(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 viewLocations = new List(); 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()); } 

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

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

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

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

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

  • Как создать собственный атрибут проверки?
  • Поместить таблицу HTML в ADO.NET DataTable
  • 'object' не содержит определения для 'X'
  • Как создать текстовое поле readonly в ASP.NET MVC3 Razor
  • Сложный объект и привязка модели ASP.NET MVC
  • Символ Escape @ в режиме просмотра бритвы
  • Преобразование формата DateTime с использованием бритвы
  • Работает ли Razor View Engine для Mono?
  • Дата не отображается на модели с типом ввода типа HTML
  • Как добавить загрузчик даты Picker Bootstrap 3 в проекте MVC 5 с использованием механизма Razor?
  • Добавление другого «питомца» в модельную форму
  • Давайте будем гением компьютера.