繁体   English   中英

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

[英]Using the Razor templating engine outside of MVC (with full mvc razor support)

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

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

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

  1. 从nuget安装“some plugin”并对其进行配置
  2. 从MVC应用程序复制粘贴模型和视图到类库项目(重要!!!复制视图而不需要任何修改就可以将视图“调整”到“某些插件”)
  3. 写一些代码行说:“你好我的'某些插件' - 给我一个名为'myExampleView.cshtml'的视图”

一个重要的条件:我期望在视图中获得完全相同的支持,就像我在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指导我这个解决方案: 用于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:如果在默认的A ppdomain上使用RazorEngine,我们无法清除临时文件。 创建一个新的AppDomain并从那里使用RazorEngine。 阅读快速入门或https://github.com/Antaris/RazorEngine/issues/244了解详情! 如果您使用的是DisableTempFileLocking,则可以忽略此以及随后的“请清理...手动”消息,这是不推荐的。 请清除'C:\\ Users [user_account] \\ AppData \\ Local \\ Temp \\ RazorEngine_qeouaznq。 ett'手动!

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

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

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

看看这个答案

一个点上面的答案。

这个项目看起来很有前景,它使用RazorOWIN

您可能无法使用Microsoft.AspNet.WebPages包中的@Html@RenderBody@RenderSection而不依赖于System.Web

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

有一个用于webapi剃刀媒体类型格式化程序 它公开了一个IViewLocator接口作为其api的一部分,它的默认实现似乎使用了你提到的文件位置约定。 您可以扩展此项目以实现目标。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM