ASP.NET MVC 3.0 Razor,从开箱即用的任何地方加载View?

Kun*_*vič 12 razor asp.net-mvc-3

是否可以在任何地方加载View而无需VirtualPathProvider在MVC 3.0中实现自定义?

如果是真的怎么办?

实际上VirtualPathProvider,从任何地方加载View 都没有问题,但是我的实现仅在MVC 2.0中工作,而不是用MVC 3.0工作,因为某些原因GetFile在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);
    }
Run Code Online (Sandbox Code Playgroud)

Global.asax.cs后面AreaRegistration.RegisterAllAreas();RegisterRoutes(RouteTable.Routes);方法方法中注册自定义VirtualPathProvider时override VirtualFile GetFile(string virtualPath),"虚拟视图"不适用.

更新2

这是否意味着课程RazorViewRazorViewEngineRender答案?

更新3

如果我有我的剃刀视图的字符串表示在文件系统中不存在(例如我在数据库中存储剃刀视图)我怎样才能使用这种方法呈现它http://buildstarted.com/2010/09/28/ MVC -3-剃刀-视图-发动机而不-A-控制器/

例如,我的View的字符串表示如下所示:

"@{
    ViewBag.Title = ""About Us"";
}

<h2>About</h2>
<p>
     Put content here.
</p>"
Run Code Online (Sandbox Code Playgroud)

更新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"中将"公共TModel模型"的声明更改为"公共虚拟TModel模型".可能还有一些应该做的改变吗?或者其他什么HtmlTemplateBase<T>应该以另一种方式完成?

Mat*_*ott 6

不要被他的文章中的Ben(@BuildStarted)示例代码混淆.他详细介绍了如何使用早期版本的Razor ViewEngine来渲染模板,而无需使用控制器操作.目的是能够以通用方式呈现模板,而不是作为特定的页面视图.(这已经演变成我们的RazorEngine模板框架@ http://razorengine.codeplex.com).

VirtualPathProvider仍然是ASP.NET的核心部分.似乎存在关于MVC 3 DependencyResolver替代a的一般混淆,VirtualPathProvider但事实并非如此,您仍然需要提供程序能够访问虚拟路径上的内容(顺便说一下,ASP.NET中的所有路径都是虚拟的) .

恢复原来的答案,你应该能够通过子类化RazorViewEngine并使用它来创建你的视图来实现你想要的.

看看这个主题:http://coderjournal.com/2009/05/creating-your-first-mvc-viewengine/


mar*_*ind 2

不,默认情况下不支持从数据库加载视图。您需要编写自己的VirtualPathProvider.

请注意,Ben 的博客文章实际上并没有直接解决您要解决的问题。以下博客文章看起来更接近您想要的内容:http://rebuildall.umbraworks.net/2009/11/17/ASP_NET_MVC_and_virtual_views。请注意,如果您尝试在数据库中存储 razor 或 aspx 视图,这并不重要。Asp.Net 中的虚拟路径提供程序只是将路径映射到字节流,字节流是该路径表示的文件的内容。