如何一起使用RazorViewEngine和自定义IView?

时间:2014-08-17 02:48:17

标签: c# asp.net-mvc razor

我花了太多时间试图解决这个问题。我自己无法解决这个问题。以下方法在我的自定义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;
    }
  1. 我想在cshtml文件中读取当前视图。最后,我想从数据库源读取cshtml文件。
  2. 我希望能够更改视图的内容。我不必拥有此功能,但如果我需要动态更改内容,那将是一个非常好的选择。
  3. 我想要执行剃刀代码。 < - 这是我真正的问题。我可以使用自定义IView读取cshtml文件,但这样做显然削弱了我在页面中呈现剃刀代码的能力。
  4. 如果有人可以提供帮助,这对我的工作非常有帮助。我已经能够实现我想要的几个选项,但是当我尝试将它们组合到一个解决方案中时,我无法让它工作。

    Back Story:

    如果我需要进行更改工作,即使是一个小小的更改,也需要我们创建一个RFC(变更请求)。除紧急情况外,通常需要1周到一个月才能获得释放。另一方面,我们可以在几个小时内完成数据库更改。我想如果我能编写一个进程,在每次发布后将所有cshtml文件复制到我们的数据库中,那将是多么美好。这看起来并不太难。我想出了如何创建一个读取cshtml文件内容的自定义IView。从数据库而不是文件中读取视图似乎并不是一件容易的事。我的问题是,当我在cshtml文件中读取它时,它不会渲染剃刀代码。而是它显示原始剃刀来源。

    到目前为止,我的工作是创建一个CustomViewEngine类,它继承自VirtualPathProviderViewEngine,它调用我的customView,成功读取cshtml文件的内容。如果我注册引擎然后我得到视图中显示的内容,但剃刀源代码显示在视图中。

    我还通过继承RazorViewEngine创建了一个CustomRazorViewEngine。这非常好用并呈现剃刀代码,我能够限制引擎只搜索.cshtml文件这是一个很好的奖励,但我还没有找到一种方法从这个类中的数据源中提取视图内容。 / p>

    我已经探索了视图引擎的继承树,试图找到一个更好的地方来注入我的自定义代码但是我迷失了。

    VirtualPathProviderViewEngine - > BuildManagerViewEngine - > RazorViewEngine - > IViewEngine

    我有两个类的代码示例,但它们是相当标准的。在stackoverflow和其他地方都可以使用类似的类。

0 个答案:

没有答案