我花了太多时间试图解决这个问题。我自己无法解决这个问题。以下方法在我的自定义IView中。它读取我的视图的内容并返回一个IView。问题是它不会在视图中呈现剃刀代码。
public void Render(ViewContext viewContext, System.IO.TextWriter writer)
{
//Load File
var rawContents = File.ReadAllText(this.viewPhysicalPath);
// Able to modify rawContents but Razor code isn't not being rendered.
writer.Write(parsedcontents);
}
以下方法是我的CustomRazorViewEngine的一部分。如果我有base.CreateView的实现,我认为这将是文件读入的地方,并将是一个解决我的问题的理想场所。我不知道如何找到来源。
protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath)
{
var view = base.CreateView(controllerContext, viewPath, masterPath);
return view;
}
如果有人可以提供帮助,这对我的工作非常有帮助。我已经能够实现我想要的几个选项,但是当我尝试将它们组合到一个解决方案中时,我无法让它工作。
Back Story:
如果我需要进行更改工作,即使是一个小小的更改,也需要我们创建一个RFC(变更请求)。除紧急情况外,通常需要1周到一个月才能获得释放。另一方面,我们可以在几个小时内完成数据库更改。我想如果我能编写一个进程,在每次发布后将所有cshtml文件复制到我们的数据库中,那将是多么美好。这看起来并不太难。我想出了如何创建一个读取cshtml文件内容的自定义IView。从数据库而不是文件中读取视图似乎并不是一件容易的事。我的问题是,当我在cshtml文件中读取它时,它不会渲染剃刀代码。而是它显示原始剃刀来源。
到目前为止,我的工作是创建一个CustomViewEngine类,它继承自VirtualPathProviderViewEngine,它调用我的customView,成功读取cshtml文件的内容。如果我注册引擎然后我得到视图中显示的内容,但剃刀源代码显示在视图中。
我还通过继承RazorViewEngine创建了一个CustomRazorViewEngine。这非常好用并呈现剃刀代码,我能够限制引擎只搜索.cshtml文件这是一个很好的奖励,但我还没有找到一种方法从这个类中的数据源中提取视图内容。 / p>
我已经探索了视图引擎的继承树,试图找到一个更好的地方来注入我的自定义代码但是我迷失了。
VirtualPathProviderViewEngine - > BuildManagerViewEngine - > RazorViewEngine - > IViewEngine
我有两个类的代码示例,但它们是相当标准的。在stackoverflow和其他地方都可以使用类似的类。