在MVC之外使用Razor模板引擎(具有完整的mvc剃刀支持)

时间:2015-07-29 08:14:11

标签: c# asp.net-mvc razor razorengine

我正在寻找这个“圣杯”很长一段时间。我经历了大量的插件,项目,解决方案等。每个解决方案都缺少一些东西。但首先要做的是第一件事。

我们想要实现的是具有将视图呈现给字符串的可能性(取自mvc应用程序)当然整个过程应该作为类库(而不是MVC应用程序)完成

我期望的是三步这样的过程:

  1. 从nuget安装“some plugin”并对其进行配置
  2. 将MVC应用程序中的模型和视图复制粘贴到类库项目(重要!!!复制视图,无需任何修改即可将视图“调整”为“某些插件”)
  3. 写一些代码行说:“你好我的'某些插件' - 给我一个名为'myExampleView.cshtml'的视图”
  4. 一个重要条件:我期待在视图中获得完全相同的支持,就像我在MVC中看到的那样(@ Html,@ RenderBody @RenderSection等)

    结果我会把这个视图作为字符串重写 - 简单就是这样。是可能还是我只是“做梦”?哪个插件提供了所有这些(甚至更多?:))

    现在 - 最接近这个描述的是RazorEngine但是我没有看到传递csthml视图名称的可能性(它足以将路径传递给cshtml视图)当然我可以编写代码来将文件内容加载到字符串并传递它是RunCompile方法,但如果有任何“RederSection” - 它将无法正确处理(至少我认为它不会)

    总结一下:我想要razor MVC(可用性与MVC应用程序相同。实际上,MVC应用程序中的视图将被简单地复制到此类库中)在这个类库中我可以引用所有内容(包括提到的System.Web)这就是我所谓的“理想解决方案”

    我想要的是致电:

    namespace Example
    {
        class Program
        {
            static void Main(string[] args)
            {
                string renderedView = MyDreamRazoEngine.Render("MyView", new MyViewModel () { Prop1= "a", Prop2 = "b", Prop3= new List<string>() { "c", "d", "e"})
            }
        }
    }
    

    其中model(位于/Model/MyViewModel.cs)定义为:

    namespace Example.Models
    {
        public class MyViewModel()
        {
            public string Prop1{get;set;}
            public string Prop2{get;set;}
            public List<string> Prop3{get;set;}
        }
    }
    

    并查看MyView(位于/View/MyView.cshtml中)的定义是:

    @model Example.Models.MyViewModel
    This is my view with Prop1 : @Prop1 and Prop2 : @Prop2 and list :
    @foreach (var p in @Model.Prop3)
    {
        @{Html.RenderPartial("viewPartial", @p);}
    }
    

    和部分视图viewPartial(位于/View/viewPartial.cshtml)定义是:

    @model String
    
    <span>I present this param3 value @Model</span>
    

    据我所知,使用RazorEngine项目可以实现一切(不包括“自动”文件处理)。但也许甚至文件处理(与MVC完全相同 - 在Views和Subdirector of Views中搜索模板)在这个引擎中可用?还是我必须自己写的东西?或者也许其他一些插件给了我所有这些功能?

    @@ UPDATE

    Anish指导我解决这个问题:razor media type formatter for webapi

    它使用razorengine和支持视图,与MVC应用程序完全相同(差不多)但是......它不起作用(肯定我错过了什么)我现在拥有的是:

    public class RazoEngineExample
        {
            private static HttpRequestMessage _request;
            static void Main(string[] args)
            {
                var viewParser = new RazorViewParser(baseTemplateType: typeof(WebApiContrib.Formatting.Razor.HtmlTemplateBase<>));
                var formatter = new RazorViewFormatter(viewParser: viewParser);
                var config = new HttpConfiguration();
                config.Formatters.Add(formatter);
    
                _request = new HttpRequestMessage();
                _request.SetConfiguration(config);
                _request.RegisterForDispose(config);
    
                var output = renderView();
    
                Console.WriteLine(output.Result);
    
                _request.Dispose();
                _request = null;
            }
    
            private static async Task<string> renderView()
            {
                var cts = new CancellationTokenSource();
                var view = new ViewResult(_request, "view", new SampleModel() { Prop1 = "p1", Prop2 = "p2", Prop3 = new List<string> { "pe1", "pe2", "pe3" } });
    
                var response = await view.ExecuteAsync(cts.Token);
                var output = await response.Content.ReadAsStringAsync();
                return output;
            }
        }
    

    它正在编译好吧,它甚至可以工作(如果我从这个视图中删除部分渲染)如果我使用局部视图我得到这样的错误:

      

    [ArgumentNullException]值不能为null。参数名称:视图

    另一件事(但绝对不那么重要)是由razorengine写的控制台消息:

      

    RazorEngine:如果在上面使用RazorEngine,我们无法清除临时文件   默认为ppdomain。创建一个新的AppDomain并使用RazorEngine   那里。阅读快速入门或   https://github.com/Antaris/RazorEngine/issues/244为了解决问题!您   可以忽略这一点以及随后的“请清理...手动”消息   如果你正在使用DisableTempFileLocking,这是不推荐的。   请清洁   “C:\用户[USER_ACCOUNT] \应用程序数据\本地\ TEMP \ RazorEngine_qeouaznq。   ett'手动!

    我已经检查过 - 并且正确设置了读取/写入权限(在此文件夹上)。

    请帮忙!!!我很亲密:))

1 个答案:

答案 0 :(得分:5)

是的,这一切都是可能的。之前已经提出了类似的问题

看看这个http://sohtanaka.developpez.com/tutoriels/javascript/creez-fenetre-modale-avec-css-et-jquery/fichiers/

answer指出了上面的答案。

one看起来很有前景,它使用 Razor OWIN

您可能无法使用project包中的@RenderBody@RenderSectionSystem.Web而不依赖IViewLocator

  

据我所知,一切(不包括&#34;自动&#34;文件   处理)可以实现使用RazorEngine项目。但也许吧   甚至文件处理(与MVC完全相同 - 搜索   视图的视图和子目录中的模板可用于此   发动机?还是我必须自己写的东西?或者也许一些   其他插件给了我所有这些功能?

有一个Microsoft.AspNet.WebPages。它公开<dependency> <groupId>org.jcef</groupId> <artifactId>jcef</artifactId> <version>3.1750</version> </dependency> <dependency> <groupId>org.jogamp.jogl</groupId> <artifactId>jogl-all</artifactId> <version>2.1.4</version> </dependency> <dependency> <groupId>org.jogamp.gluegen</groupId> <artifactId>gluegen-rt</artifactId> <version>2.1.4</version> </dependency> 接口作为其 api 的一部分,其默认实现似乎使用您提到的文件位置约定。您可以扩展此项目以实现目标。