仅为C#注册RazorViewEngine(仅适用于.cshtml文件)

时间:2011-10-03 11:15:05

标签: asp.net asp.net-mvc asp.net-mvc-3 razor global-asax

我只在我的一个ASP.NET MVC 3应用程序上使用RazorViewEngine,并在我的 Global.asax.cs的Application_Start方法中使用以下代码清除了Web窗体视图引擎档案

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

我决定看到一些坚实的东西,以便我对这两行代码的努力感到满意,并尝试渲染一个不存在的局部视图,我得到了这个结果:

  

找不到部分视图'_RortortMapPartialView'或没有视图   引擎支持搜索的位置。以下地点是   搜索:   〜/地区/住宿/浏览/度假/ _ResortMapPartialView.cshtml   〜/地区/住宿/浏览/度假/ _ResortMapPartialView.vbhtml   〜/地区/住宿/查看/共享/ _ResortMapPartialView.cshtml   〜/地区/住宿/查看/共享/ _ResortMapPartialView.vbhtml   〜/查看/度假/ _ResortMapPartialView.cshtml   〜/查看/度假/ _ResortMapPartialView.vbhtml   〜/查看/共享/ _ResortMapPartialView.cshtml   〜/查看/共享/ _ResortMapPartialView.vbhtml

看起来好一点。现在它寻找比以前更少的物品。但是,.vbhtml扩展名的文件仍然让我变得不合格。

问题在于:我们如何摆脱它们?

2 个答案:

答案 0 :(得分:6)

我的建议是覆盖以下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
   }

}

请参阅我的回答talks about overriding these values。同样的原则适用。您需要在CSHtmlViewEngine方法中注册此修改过的ViewEngine(ApplicationStart

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

答案 1 :(得分:0)

您可以直接更改现有的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();
}