Зарегистрируйте RazorViewEngine только для C # (только для файлов .cshtml) - PullRequest
2 голосов
/ 03 октября 2011

Я использую RazorViewEngine только в одном из моих приложений ASP.NET MVC 3, и я очистил механизм просмотра веб-форм с помощью следующего кода внутри Application_Start метода моего Global.asax.cs файла

ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new RazorViewEngine());

Я решил увидеть что-то солидное, чтобы быть довольным этим усилием из двух строк кода, и я пытаюсь визуализировать частичное представление, которого не существует, и я получил такой результат:

Частичное представление '_ResortMapPartialView' не найдено или отсутствует представление движок поддерживает поиск локаций. Следующие места были что искали: ~ / Районы / Размещение / Views / курорт / _ResortMapPartialView.cshtml ~ / Районы / Размещение / Views / курорт / _ResortMapPartialView.vbhtml ~ / Районы / Размещение / Просмотров / Shared / _ResortMapPartialView.cshtml ~ / Районы / Размещение / Просмотров / Shared / _ResortMapPartialView.vbhtml ~ / Views / курорт / _ResortMapPartialView.cshtml ~ / Views / курорт / _ResortMapPartialView.vbhtml ~ / Views / Shared / _ResortMapPartialView.cshtml ~ / Views / Shared / _ResortMapPartialView.vbhtml

выглядит немного лучше. Теперь он ищет меньше предметов, чем раньше. Но все же файлы с расширениями .vbhtml делают меня неуязвимым.

Вопрос в том, как мы можем от них избавиться?

Ответы [ 2 ]

6 голосов
/ 03 октября 2011

Я бы предложил переопределить определения RazorViewEngine для следующего, чтобы включить только файлы cshtml.

  • AreaViewLocationFormats
  • AreaMasterLocationFormats
  • AreaPartialViewLocationFormats
  • ViewLocationFormats
  • MasterLocationFormats
  • PartialViewLocationFormats
  • FileExtensions

Краткий пример:

public class CSHtmlViewEngine: RazorViewEngine
{
    public CSHtmlViewEngine()
    {
        base.AreaViewLocationFormats=
            new string[]
                {
                    "~/Views/{1}/{0}.cshtml",
                    "~/Views/Shared/{0}.cshtml"
                };

        base.AreaPartialViewLocationFormats =
            new string[]
                {
                    "~/Areas/{2}/Views/{1}/{0}.cshtml",
                    "~/Areas/{2}/Views/Shared/{0}.cshtml",
                };

   // All the other LocationFormats listed above will also need to be amended
   // Don't forget the FileExtensions array
   }

}

См. Мой ответ, который говорит о переопределении этих значений . Тот же принцип применяется. Вам нужно будет зарегистрировать этот измененный ViewEngine (CSHtmlViewEngine) в методе ApplicationStart

ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new CSHtmlViewEngine());
0 голосов
/ 09 сентября 2013

Вместо создания подкласса RazorViewEngine или его полной замены, вы можете просто изменить существующее свойство PartialViewLocationFormats RazorViewEngine. Этот код идет в Application_Start:

System.Web.Mvc.RazorViewEngine rve = (RazorViewEngine)ViewEngines.Engines
  .Where(e=>e.GetType()==typeof(RazorViewEngine))
  .FirstOrDefault();

string[] additionalPartialViewLocations = new[] { 
  "~/Views/[YourCustomPathHere]"
};

if(rve!=null)
{
  rve.PartialViewLocationFormats = rve.PartialViewLocationFormats
    .Union( additionalPartialViewLocations )
    .ToArray();
}
...