c# - 在 ASP.NET 5 中将 Razor View 呈现为字符串

标签 c# asp.net razor asp.net-core

在以前的 ASP.NET 版本中,虽然不是很简单,但可以将 Razor View 呈现为字符串。我似乎使用的方法是使用假 Controller ,或者也使用一些外部引擎,如 RazorEngine .

现在,ASP.NET 5 改变了很多东西,我想知道现在是否比以前更简单了。那么在新版本的框架中,是否有一种直接的方法将 Razor View 呈现为字符串,或者我们仍然需要使用以前版本中的方法?

最佳答案

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

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();
    }
}

我这样调用它:

var path = "~/Views/Home/Index.cshtml";
var viewDataDictionary = new ViewDataDictionary(new Microsoft.AspNet.Mvc.ModelBinding.EmptyModelMetadataProvider(), new Microsoft.AspNet.Mvc.ModelBinding.ModelStateDictionary());
var actionContext = new ActionContext(httpContextAccessor.HttpContext, new Microsoft.AspNet.Routing.RouteData(), new ActionDescriptor());
viewDataDictionary.Model = null;
var text = await RenderView(path, viewDataDictionary, actionContext);

当然,我的viewDataDictionaryactionContext变量是通过另外一种方法设置的,用于封装。如果您愿意,对 new ViewDataDictionary 行的修改可能会导致类型化模型绑定(bind)到您的 View 。

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

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

这是在 beta-3 下编写的;它仍在构建,但有些事情可能会改变。如果有的话,我会尽量回到这里更新。

关于c# - 在 ASP.NET 5 中将 Razor View 呈现为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30362156/

相关文章:

c# - 需要连接到 C++ DLL

c# - "The given key was not present in the dictionary"nHibernate C#

asp.net - 如何在所选项目上启用工作流状态 'write'?

c# - 在 asp.net mvc 应用程序中将评论保存到数据库时如何维护评论的格式?

c# - 如何设置一个程序来改变 C# 中的数量?

javascript - 在 asp.net webforms 中以编程方式创建控件时,在 JavaScript 中查找控件

javascript - MVC Razor 中的 DropBox

c# - 在 Razor 中,如何根据元素的属性检查 ViewBag IEnumerable 对象中是否存在对象?

html - MVC 4 Razor 添加输入类型日期

c# - 在 C# 中将 Dictionary<key, List<obj>> 转换为 List<obj> 的简单且最佳方法