我创建了一个自定义View Engine来处理移动请求。这些视图必须具有“.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;
}
}
我在Application_Start
事件中的位置0(成为顶级引擎)的ViewEngines.Engines中插入了此ViewEngine。
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>
现在,如果我从移动平台访问主页(controller = pages,action = main),我将获得以下异常:
无法确定“〜/ ViewsMobile / Pages / Main.mobile”的代码语言。在
行崩溃base.FindView(controllerContext, viewName, masterName, false);
这是堆栈跟踪:
[InvalidOperationException:无法确定代码语言 “〜/ ViewsMobile /页/ Main.mobile] System.Web.WebPages.Razor.WebPageRazorHost.GetCodeLanguage()+ 24401
System.Web.WebPages.Razor.WebPageRazorHost..ctor(String virtualPath, String physicalPath)+136
System.Web.Mvc.MvcWebRazorHostFactory.CreateHost(String virtualPath, String physicalPath)+43 ....
你知道我如何为我的观点使用自定义扩展程序,如“.mobile”,并在每个内部使用Razor吗?
提前致谢。
亲切的问候。
何。