一、前言

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

  本文章中采用的是ASP.NET Core MVC原生的方法;当然我在YOYOFx中也实现了这种视图引擎 ( https://github.com/maxzhang1985/YOYOFx/blob/master/AspNetCore/YOYO.AspNetCore.ViewEngine.Razor ) 。

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

二、实现视图渲染器

  其实在ASP.NET Core MVC中给我们提供了这样的方法,只是用起来不太方便,我们来对它进行一下封装。

  框架早已经为我们提供了视图渲染的接口 IRazorViewEngine 通过它的FindView方法来查找视图及.cshtml文件,当然查找方法也与MVC中的视图路径规则是对应的,本来就是一个东西嘛:)

  我们来一步步实现,首先我们建立一个视图渲染器的接口:

public interface IViewRenderService
{
Task<string> RenderToStringAsync(string viewName, object model);
}

  然后是实现类了,代码很简单一看就懂了:

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

三、如何使用

  我们使用一个简单的例子来说明如何使用我们上面那个渲染器。

  1、建立ViewModel

public class MyUserViewModel
{
public string Name { set; get; }
}

  2、建立视图

@model WebApplication6.Models.MyUserViewModel
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<title>Render view to string</title>
</head>
<body>
<div>
@Model.Name
</div>
</body>
</html>

  3、修改HomeController

public class HomeController : Controller
{
private IViewRenderService _viewRenderService;
public HomeController(IViewRenderService viewSendeRenderService)
{
_viewRenderService = viewSendeRenderService;
} public async Task<IActionResult> Index()
{
var user = new MyUserViewModel { Name = "hello world" };
var result = await _viewRenderService.RenderToStringAsync("Home/Template1", user);
return Content(result);
}
}

  4、别忘了Startup

public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<IViewRenderService, ViewRenderService>();
services.AddMvc();
}

四、写在最后

  最后我只能说在ASP.NET Core中是万物皆DI啊,其实ASP.NET Core中的实现早就为我们想好了这些功能,只是改变了使用方式。

  GitHub:https://github.com/maxzhang1985/YOYOFx  如果觉还可以请Star下, 欢迎一起交流。

  .NET Core 开源学习群: 214741894

ASP.NET Core中使用Razor视图引擎渲染视图为字符串的更多相关文章

  1. Core中使用Razor视图引擎渲染视图为字符串 阅读目录

    Core中使用Razor视图引擎渲染视图为字符串 } <!DOCTYPE html> <html> <head> <title>Render view ...

  2. 【翻译】介绍 ASP.NET Core 中的 Razor Pages

    介绍 ASP.NET Core 中的 Razor Pages 原文地址:Introduction to Razor Pages in ASP.NET Core         译文地址:介绍 asp. ...

  3. ASP.NET Core 中的 Razor 页面介绍

    标题:ASP.NET Core 中的 Razor 页面介绍 地址:https://docs.microsoft.com/zh-cn/aspnet/core/razor-pages/index?view ...

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

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

  5. .NET Core中使用Razor模板引擎

    一.简介 在MVC以外的场景中,我们往往需要完成一些模板引擎生成代码或页面的工作:在以前我们一般常用的有Razor.NVeocity.VTemplate.虽然所有的模板系统都具有一些共同特征,但 Ra ...

  6. asp.net core中的razor页面

    Razor 页面(Razor Pages)是 ASP.NET Core 2.0 中新增的一种Web页面模型,相对MVC形式更加简单易用,可以说是一个服务端的MVVM模型,本文简单的介绍一下它的用法. ...

  7. ASP.NET CORE RAZOR :将文件上传至 ASP.NET Core 中的 Razor 页面

    本部分演示使用 Razor 页面上传文件. 本教程中的 Razor 页面 Movie 示例应用使用简单的模型绑定上传文件,非常适合上传小型文件. 有关流式传输大文件的信息,请参阅通过流式传输上传大文件 ...

  8. ASP.NET Core 中的 Razor 文件编译

    asp .net core mvc 3.0 在编译的时候做了一些改变,有些view视图更改需要重新编译,你也可以配置运行时编译,不用每次更改都去重新生成,具体代码如下,从官方文档看到,做个记录. Ra ...

  9. 1.ASP.NET Core 中向 Razor Pages 应用添加模型

    右键单击“RazorPagesMovie”项目 >“添加” > “新建文件夹”. 将文件夹命名为“Models”.右键单击“Models”文件夹. 选择“添加” > “类”. 将类命 ...

随机推荐

  1. Grails架设和配置--起步

    现在作这些配置有些轻车熟路了.. 因为RAILS ON RUBY和它真的有很多相像的,, 什么DRY,什么约定先于配置这些的概念... 然后,GITHUB上有好文档,可以一步一步的实践.. https ...

  2. 如何查看SQL Server的数据库实例名

    其实一般默认就是MSSQLSERVER  (注意,就是英文大写). 点击开始,运行,services.mcs 然后查阅所有SQL Server的项,其中括号中字符串的就是实例名 reference: ...

  3. python operator模块

    官网:https://docs.python.org/3.4/library/operator.html http://pymotw.com/2/operator/

  4. socket编程:客户端与服务器间的连接以及各函数的用法

    在认真的看UNP之前,一直被socket编程说的云里雾里,今天我要让大家从整天上认识socket编程,让我们知道socket编程的整个流程和各个函数的用法.这样:我们在写一些简单的socket编程时就 ...

  5. C#怎么得到主机名,IP,MAC

    一:基础知识 a: Dns 类 提供简单的域名解析功能. Dns 类是一个静态类,它从 Internet 域名系统 (DNS) 检索关于特定主机的信息. 在 IPHostEntry 类的实例中返回来自 ...

  6. 我的学习笔记之node----node.js+socket.io实时聊天(2)

    废话不多说,直接贴代码吧.注释很详细了. 服务端代码: /** * Created by LZX on 2015/10/7. */(function () { var d = document, w ...

  7. 从大学开始学C++到现在的一些感悟

    Since I choose this road, I will not regret it.     --Mereyct 端午过后的第二天,闲着没事,更新一下博客. 写这个博客的原因是,看到了群里有 ...

  8. 对List

     class MyCompare implements Comparator//自定义比较方式 要实现Conparator的 compare 方法 {     public int compare(O ...

  9. python多线程机制

    Python中的线程从一开始就是操作系统的原生线程.而Python虚拟机也同样使用一个全局解释器锁(Global Interpreter Lock,GIL)来互斥线程多Python虚拟机的使用. GI ...

  10. MVC 文件上传

    项目需要,做一个图片上传的功能,本来是很简单,但是需要同时上传多个文件,并分条带一些额外的信息,听上去很复杂,通过下面图就可以一目了然: 网上找过一些方法,但多为不支持图片与其他信息关联,或者分两次上 ...