我创建了一个自定义视图引擎来处理移动请求。这些视图必须具有“.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?
提前致谢。
亲切的问候。
何塞。