use*_*696 14 c# asp.net razor asp.net-core
在以前的ASP.NET版本中,将Razor视图呈现为字符串是可能的,尽管不是很简单.我看起来的方法是使用假控制器,或者使用像RazorEngine这样的外部引擎.
现在,ASP.NET 5改变了很多东西,我想知道这是否比以前更简单.所以在新版本的框架中有一种直接的方式将Razor视图呈现为字符串,或者我们仍然需要使用以前版本中的方法?
Mat*_*rey 19
我使用以下注入的类型IServiceProvider:
ICompositeViewEngine viewEngine;
ITempDataProvider tempDataProvider;
IHttpContextAccessor httpContextAccessor;
Run Code Online (Sandbox Code Playgroud)
我使用以下方法呈现内容:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
我称之为:
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);
Run Code Online (Sandbox Code Playgroud)
当然,我viewDataDictionary和actionContext变量是由另一种封装方法设置的.new ViewDataDictionary如果您选择,对该行的修改可能会导致键入的模型绑定到您的View.
这段代码使用了大量的用法,我想我已经在下面列出了它们.否则,VS2015非常适合找到它们.
using Microsoft.AspNet.Mvc;
using Microsoft.AspNet.Mvc.Rendering;
Run Code Online (Sandbox Code Playgroud)
这是在beta-3下编写的; 它仍在构建,但有些事情可能会改变.如果确实如此,我会尝试回到这里进行更新.
| 归档时间: |
|
| 查看次数: |
12824 次 |
| 最近记录: |