【问题标题】:Using the Razor templating engine outside of MVC (with full mvc razor support)在 MVC 之外使用 Razor 模板引擎(具有完整的 mvc razor 支持)
【发布时间】:2015-10-20 02:30:24
【问题描述】:

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

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

我期望的是这样的三个步骤:

  1. 从 nuget 安装“一些插件”并进行配置
  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/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 中的完全相同 - 在视图和视图的子目录中搜索模板)?还是我必须自己写的东西?或者也许其他一些插件给了我所有这些功能?

@@更新

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] 值不能为空。参数名称:视图

另一件事(但肯定不太重要)是 razorengine 编写的控制台消息:

RazorEngine:如果您在 默认一个 ppdomain。创建一个新的 AppDomain 并使用 RazorEngine 那里。阅读快速入门或 https://github.com/Antaris/RazorEngine/issues/244 了解详情!你 可以忽略此消息以及所有以下“请手动清理...手动”消息 如果您使用的是 DisableTempFileLocking,则不建议这样做。 请清洁 'C:\Users[user_account]\AppData\Local\Temp\RazorEngine_qeouaznq。 ett' 手动!

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

请帮忙!!!我很接近:)

【问题讨论】:

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


    【解决方案1】:

    是的,这一切皆有可能。之前有人问过类似的问题

    看看这个answer

    这个one 指向上面的答案。

    这个project 看起来也很有前途,它使用 RazorOWIN

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

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

    有一个razor media type formatter for webapi。它公开了一个 IViewLocator 接口作为其 api 的一部分,并且它的默认实现似乎使用您提到的文件位置约定。您或许可以扩展此项目以实现您的目标。

    【讨论】:

    • Anish - 我查看了您回复中附加的所有链接。没有什么,我可以标记为“完整的解决方案” 您写道:“根据您的需要,当然有各种实施方法”--> 我已经非常清楚地说明了我的需求。我想要razor MVC(可用性与MVC应用程序相同。事实上,来自MVC应用程序的视图将简单地复制到这个类库中)在这个类库中我可以引用所有内容(包括提到的System.Web)
    • @PiotrFilipowicz 我已经更新了我的答案并添加了一个可以帮助你的链接。
    • 感谢您的提示。尽管如此,它仍然不是完整的“一键式”解决方案。从单元测试(可在 github 页面上获得)复制部分代码后,从视图中呈现字符串 - 我仍然得到:“当前上下文中不存在名称 'HTML'” 此视图的生成源代码有只有简单的使用(系统,集合通用等)所以,很明显,它不知道“html”是什么。即使我添加了正确的使用(和正确的引用),它仍然不知道 html(因为这是 HtmlHelper)我的需求(“不需要更改视图”)没有得到满足
    • 上一条评论是关于:razor media type formatter for webapi (WebApiContrib.Formatting.Razor)
    • 好的。我看到有正确的模板(支持 HTML - 称为 HtmlTemplateBase) 将“初始化”更改为: var viewParser = new RazorViewParser(baseTemplateType: typeof(HtmlTemplateBase)); var formatter = new RazorViewFormatter(viewParser: viewParser);我明白了,生成的源代码包含更改为 HtmlTemplateBase 的模板,但仍然......错误消息是:“名称'Html'在当前上下文中不存在”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    • 1970-01-01
    • 2013-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多