在MVC 3.0中实现自定义的VirtualPathProvider?
如果是真的怎么办?
基本上,实现自定义的VirtualPathProvider它将不会是一个问题
从任何地方查看,但是我的实现只能在MVC 2.0中工作,而不是MVC 3.0,因为某些原因方法GetFile newer调用MVC 3.0中不存在的视图,在这种情况下,我正在获得“Server Error in’/’Application”.
我从这里跟随我的自定义VirtualPathProvider相同的代码:http://buildstarted.com/2010/09/28/mvc-3-razor-view-engine-without-a-controller/
更新1
确定我已经修复了我的自定义VirtualPathProvider的问题我注册我的自定义VirtualPathProvider提供者的第一行在Application_Start()
protected void Application_Start() { //Should be first line before routes and areas registration. HostingEnvironment.RegisterVirtualPathProvider(new MyVirtualPathProvider()); AreaRegistration.RegisterAllAreas(); RegisterGlobalFilters(GlobalFilters.Filters); RegisterRoutes(RouteTable.Routes); }
当在Global.asax.cs中注册自定义的VirtualPathProvider之后,将在ZoneRegistration.RegisterAllAreas();或者RegisterRoutes(RouteTable.Routes);方法方法重写VirtualFile GetFile(string virtualPath)将无法用于“虚拟视图”.
更新2
这是否意味着类RazorView和RazorViewEngineRender是答案?
更新3
如果我有文件系统中不存在的剃须刀视图的字符串表示(例如,我在数据库中存储剃刀视图),我可以使用这种方法渲染它http://buildstarted.com/2010/09/28/mvc-3-razor-view-engine-without-a-controller/
例如,我的视图的字符串表示形式如下所示:
"@{ ViewBag.Title = ""About Us""; } <h2>About</h2> <p> Put content here. </p>"
更新4
现在我看,能够使用@ Html.< something>应该实现自定义的TemplateBase.
HtmlTemplateBase< T>的实现示例可能在这里http://www.fidelitydesign.net/?p=239,但它不会与RazorEngine v2工作,我成功获取模板编译,然后在程序集加载方法public override void Execute()将不会被执行我得到一个错误:方法或操作是未实现(stacktrace:http://tinypic.com/r/dcow4/7)
为了使“公开覆盖T模式”发生,我在“公共抽象类TemplateBase:TemplateBase,ITemplate”中将“public TModel Model”的声明改为“public virtual TModel Model”.可能还有另外一个变化呢?或者HtmlTemplateBase< T>应该做另外一种方式?