Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在ASP.NET 5中将Razor视图渲染为字符串_C#_Asp.net_Razor_Asp.net Core - Fatal编程技术网

C# 在ASP.NET 5中将Razor视图渲染为字符串

C# 在ASP.NET 5中将Razor视图渲染为字符串,c#,asp.net,razor,asp.net-core,C#,Asp.net,Razor,Asp.net Core,在以前的ASP.NET版本中,可以将Razor视图呈现为字符串,尽管不是很简单。我的方法似乎是使用一个假的控制器,或者也使用一些外部引擎,比如 现在,ASP.NET5改变了很多事情,我想知道这是否比以前更简单。因此,在新版本的框架中,有没有一种简单的方法可以将Razor视图呈现为字符串,或者我们仍然需要使用以前版本中的方法?有一种解决方案,我一年前就使用过。我不确定是否有新的/更好的方法,但它解决了问题 public string RenderViewToString(string viewNa

在以前的ASP.NET版本中,可以将Razor视图呈现为字符串,尽管不是很简单。我的方法似乎是使用一个假的控制器,或者也使用一些外部引擎,比如


现在,ASP.NET5改变了很多事情,我想知道这是否比以前更简单。因此,在新版本的框架中,有没有一种简单的方法可以将Razor视图呈现为字符串,或者我们仍然需要使用以前版本中的方法?

有一种解决方案,我一年前就使用过。我不确定是否有新的/更好的方法,但它解决了问题

public string RenderViewToString(string viewName, object model)
{
    ViewData.Model = model;
    using (var sw = new StringWriter())
    {
       var viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
       var viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
       viewResult.View.Render(viewContext, sw);
       viewResult.ViewEngine.ReleaseView(ControllerContext, viewResult.View);
       return sw.GetStringBuilder().ToString();
     }
}

我使用从IServiceProvider注入的以下类型:

ICompositeViewEngine viewEngine;
ITempDataProvider tempDataProvider;
IHttpContextAccessor httpContextAccessor;
我使用以下方法呈现内容:

private async Task<string> RenderView(string path, ViewDataDictionary viewDataDictionary, ActionContext actionContext)
{
    using (var sw = new System.IO.StringWriter())
    {
        var viewResult = viewEngine.FindView(actionContext, path);

        var viewContext = new ViewContext(actionContext, viewResult.View, viewDataDictionary, new TempDataDictionary(httpContextAccessor, tempDataProvider), sw);

        await viewResult.View.RenderAsync(viewContext);
        sw.Flush();

        if (viewContext.ViewData != viewDataDictionary)
        {
            var keys = viewContext.ViewData.Keys.ToArray();
            foreach (var key in keys)
            {
                viewDataDictionary[key] = viewContext.ViewData[key];
            }
        }

        return sw.ToString();
    }
}
当然,我的
viewDataDictionary
actionContext
变量是通过另一种封装方法设置的。如果选择,对
新建ViewDataDictionary
行的修改可能会导致类型化模型绑定到视图

这段代码使用了大量的用法,我想我已经在下面列出了它们。否则,VS2015很容易找到它们

using Microsoft.AspNet.Mvc;
using Microsoft.AspNet.Mvc.Rendering;

这是根据beta-3编写的;它仍然在构建,但有些事情可能会改变。如果需要,我将尝试返回此处进行更新。

是否要将操作的HTML内容插入字符串变量?或者只是在另一个视图中呈现ActionResult?@FabioLuz我想呈现该视图,并将呈现的HTML代码放入字符串变量中。如果您想在MVC 6下执行此操作,它应该非常简单。这只是一个获得正确的依赖关系来rander the razor view的问题。但是,如果您不在它的范围内,这里有一个例子:深入了解
Templater.Run
是如何实现的。@tugberk这个链接很好,谢谢!我不是OP,但您的repo非常有用。不幸的是,asp.net-5中也不存在ViewEngines类。@MattDeKrey,但它在v4中存在(我知道不是OP请求)!aa这绝对是该版本的最佳选择!很好,救了我一天,razor使用的html助手没有任何问题。谢谢你很乐意帮忙!感谢你注意到它仍然有效-我没有回去更改它,所以没有在我的答案中添加注释。没有看到你是如何获得这些注入对象的,并且方法的签名与你所称的方式不一致…@Shockwaver-万一有人对此感到好奇,这只是依赖注入(DI)。服务依赖项通常是类的构造函数的参数,DI容器确定从何处获取它们。关于签名不一致性,Matt可能在具有ActionContext属性的控制器中编写了原始方法,因此您可以更改为大写字母a,并从控制器中开始测试代码。
using Microsoft.AspNet.Mvc;
using Microsoft.AspNet.Mvc.Rendering;