0

我创建了一个自定义视图引擎来处理移动请求。这些视图必须具有“.mobile”扩展名,并且必须放在 /ViewsMobile 根文件夹下:

public class MobileViewEngine : RazorViewEngine
    {
        public MobileViewEngine()
        {
            MasterLocationFormats = new string[] { "~/ViewsMobile/Shared/{0}.mobile" };
            ViewLocationFormats = new string[] { "~/ViewsMobile/{1}/{0}.mobile", "~/ViewsMobile/Shared/{0}.mobile" };
            PartialViewLocationFormats = new string[] { "~/ViewsMobile/Widgets/{1}/{0}.mobile" };
            FileExtensions = new string[] { "mobile" };
        }
        public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
        {
            ViewEngineResult result = null;
            var request = controllerContext.HttpContext.Request;

            if (request.Browser.IsMobileDevice)
            {
               result = base.FindView(controllerContext, viewName, masterName, false);
            }
            return null;
        }
    }

我将此 ViewEngine 插入到 ViewEngines.Engines 中的位置 0(作为顶级引擎)Application_Start事件中。

ViewEngines.Engines.Insert(0, new MobileViewEngine());

在我将此行添加到 web.config 以识别 .mobile 扩展名之后:

 <buildProviders>
        <add extension=".mobile" type="System.Web.WebPages.Razor.RazorBuildProvider, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
 </buildProviders>

现在,如果我从移动平台访问主页(控制器 = 页面,操作 = 主),我会收到以下异常:

无法确定“~/ViewsMobile/Pages/Main.mobile”的代码语言。上线崩溃base.FindView(controllerContext, viewName, masterName, false);

这是堆栈跟踪:

[InvalidOperationException:无法确定“~/ViewsMobile/Pages/Main.mobile] System.Web.WebPages.Razor.WebPageRazorHost.GetCodeLanguage()+24401 的代码语言

System.Web.WebPages.Razor.WebPageRazorHost..ctor(字符串虚拟路径,字符串物理路径)+136

System.Web.Mvc.MvcWebRazorHostFactory.CreateHost(String virtualPath, String physicalPath) +43 ....

你知道我如何为我的视图使用自定义扩展,如“.mobile”,并在每个视图中使用 Razor?

提前致谢。

亲切的问候。

何塞。

4

0 回答 0