您的位置:首页 > 编程语言 > ASP

ASP.NET Core中使用Razor视图引擎渲染视图为字符串(转)

2018-05-19 16:32 886 查看

一、视图渲染说明

在有些项目需求上或许需要根据模板生产静态页面,那么你一样可以用Razor语法去直接解析你的页面从而把解析的页面生成静态页,这样的使用场景很多,不限于生成静态页面,视图引擎为我们提供了模型到视图的代码或文本生成的能力。

当然在MVC 4、5的时代,我们也使用过如RazorEngine这样的第三方的视图引擎,那时候MVC中的Razor与框架耦合的比较紧密,第三方开源组件帮我们实现了在任意项目中使用Razor渲染视图为文本的方式;但是在.NET Core中 RazorEngine开源组件并没有移植过来。

二、本示例,创建一个服务,用于处理将制定路径的视图和参数,解析成字符串

/// <summary>
/// 定义视图渲染服务
/// </summary>
public class ViewRenderService : IViewRenderService
{
private readonly IRazorViewEngine _razorViewEngine;
private readonly ITempDataProvider _tempDataProvider;
private readonly IServiceProvider _serviceProvider;

public ViewRenderService(IRazorViewEngine razorViewEngine,
ITempDataProvider tempDataProvider,
IServiceProvider serviceProvider)
{
_razorViewEngine = razorViewEngine;
_tempDataProvider = tempDataProvider;
_serviceProvider = serviceProvider;
}

public async Task<string> RenderToStringAsync(string viewName, object model)
{
var httpContext = new DefaultHttpContext { RequestServices = _serviceProvider };
var actionContext = new ActionContext(httpContext, new RouteData(), new ActionDescriptor());
using (var sw = new StringWriter())
{
var viewResult = _razorViewEngine.FindView(actionContext, viewName, false);

if (viewResult.View == null)
{
throw new ArgumentNullException($"{viewName} does not match any available view");
}

var viewDictionary = new ViewDataDictionary(new EmptyModelMetadataProvider(), new ModelStateDictionary())
{
Model = model
};

var viewContext = new ViewContext(
actionContext,
viewResult.View,
viewDictionary,
new TempDataDictionary(actionContext.HttpContext, _tempDataProvider),
sw,
new HtmlHelperOptions()
);

await viewResult.View.RenderAsync(viewContext);
return sw.ToString();
}
}
}
public interface IViewRenderService
{
Task<string> RenderToStringAsync(string viewName, object model);
}

 

使用过程:

1.注册服务,在ConfigureServices() 中

//绑定服务,
services.AddScoped<IViewRenderService, ViewRenderService>();

2.在控制器中通过服务调用方法

public class Emall1MvcController : Controller
{
private IViewRenderService _view = null;
public Emall1MvcController(IViewRenderService view) {
this._view= view;
}
public IActionResult Index()
{
return View(123);
}
//调用服务方法,返回html 字符串
public async Task<string> Test1()
{
return await _view.RenderToStringAsync("Emall1Mvc/Index", 456);
}
}
@model int
@{
ViewData["Title"] = "Index";
}

<h2>Index</h2>
测试变量如下:
<p>
@Model
</p>

返回结果;

更多:

Asp.Net Core 自定义设置Http缓存处理

ASP.NET Core -中间件(Middleware)使用

Asp.Net Core 通过自定义中间件防止图片盗链的实例(转)

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: