.NET教程 解决MVC视图中的中文被html编码的问题

  在昨天有问同学想我提出了这样的一个问题:.NET Core 中文等非英文文字html编码输出问题。小编昨天自己也动手实验了一下,发现是有这趟的问题,下面,就针对这个问题,小编总结了一些东西!

  比如下面的Razor视图代码:

  @{

  ViewBag.Title = "代码改变世界";

  }

  输出的html代码变成了:

  上面的 @ViewBag.Title 实际上等同于下面的代码:

  @Html.Raw(Html.Encode(ViewBag.Title))

  所以解决这个问题需要从ASP.NET Core MVC中的HtmlHelper下手(上面代码中Html的类型就是HtmlHelper)。

  从GitHub上签出MVC的源代码看看HtmlHelper.Encode()的实现:

  private readonly IHtmlGenerator _htmlGenerator;

  public string Encode(string value)

  {

  return _htmlGenerator.Encode(value);

  }

  实际调用的是IHtmlGenerator接口的Encode()方法,MVC中实现这个接口的是DefaultHtmlGenerator,其对应的Encode()实现代码如下:

  private readonly HtmlEncoder _htmlEncoder;

  public string Encode(string value)

  {

  return !string.IsNullOrEmpty(value) ? _htmlEncoder.Encode(value) : string.Empty;

  }

  原来真正干活的主角是HtmlEncoder,但它不是在MVC中实现的,而是在.NET Core Framework中实现的,命名空间是 System.Text.Encodings.Web 。

  写个.NET Core控制台程序直接调用HtmlEncoder看看是不是就是它惹的祸。

  public class Program

  {

  public static void Main(string[] args)

  {

  Console.WriteLine(HtmlEncoder.Default.Encode("代码改变世界"));

  }

  }

  输出结果与MVC中是同样的问题。

  

  试试不用默认的HtmlEncoder实例(HtmlEncoder.Default),而是自己调用HtmlEncoder.Create()方法创建实例,这时发现了UnicodeRange参数类型。

  public static HtmlEncoder Create(params UnicodeRange[] allowedRanges);

  当使用UnicodeRanges.All作为参数创建HtmlEncoder实例时,问题就解决了。

  Console.WriteLine(HtmlEncoder.Create(UnicodeRanges.All).Encode("代码改变世界"));

  紧接着从GitHub上签出System.Text.Encodings.Web的源代码,看看HtmlEncoder.Default对应的HtmlEncode实例是如何被创建的:

  internal readonly static DefaultHtmlEncoder Singleton = new DefaultHtmlEncoder(new TextEncoderSettings(UnicodeRanges.BasicLatin));

  原来用的是UnicodeRanges.BasicLatin,难怪中文会被编码,搞不懂为什么默认不用UnicodeRanges.All?

  知道了问题的原因,解决起来就不难了,只要我们以HtmlEncoder.Create(UnicodeRanges.All)创建HtmlEncoder实例,并替换掉MVC中所用的默认HtmlEncoder实例。那如何替换呢?

  回到MVC的源代码中,看看DefaultHtmlGenerator的实现,发现它的构造函数参数中有HtmlEncoder:

  public DefaultHtmlGenerator(

  IAntiforgery antiforgery,

  IOptions optionsAccessor,

  IModelMetadataProvider metadataProvider,

  IUrlHelperFactory urlHelperFactory,

  HtmlEncoder htmlEncoder,

  ClientValidatorCache clientValidatorCache)

  {

  }

  根据.NET从上到下、由内而外全面依赖注入的秉性,这个地方应该也是依赖注入的,我们只需注入一个新的HtmlEncoder实例即可,是不是这样呢?

  码上一行,你就知道。

  在 Startup.cs 的 ConfigureServices() 方法中添加下面的一行代码:

  services.AddSingleton(HtmlEncoder.Create(UnicodeRanges.All));

  运行ASP.NET Core站点,输出结果如下:

  一行注入,立马解决。依赖注入的威力,.NET Core的魅力。

时间: 2024-10-04 09:48:19

.NET教程 解决MVC视图中的中文被html编码的问题的相关文章

依赖注入的威力,.NET Core的魅力:解决MVC视图中的中文被html编码的问题

有园友在博问中提了这样一个问题 —— .NET Core 中文等非英文文字html编码输出问题,到我们的 ASP.NET Core 项目中一看,也是同样的问题. 比如下面的Razor视图代码: @{ ViewBag.Title = "代码改变世界"; } <title>@ViewBag.Title</title> 输出的html代码变成了: <title>代码改变世界</title> 上面的 @ViewBag.Title 实际上等同于下面

【转】依赖注入的威力,.NET Core的魅力:解决MVC视图中的中文被html编码的问题

有园友在博问中提了这样一个问题 -- .NET Core 中文等非英文文字html编码输出问题,到我们的 ASP.NET Core 项目中一看,也是同样的问题. 比如下面的Razor视图代码: @{ ViewBag.Title = "代码改变世界"; } <title>@ViewBag.Title</title> 输出的html代码变成了: <title>代码改变世界</title> 上面的 @ViewBag.Title 实际上等同于下面

解决.NET Core MVC 视图中的中文被html编码的问题

在  .net core mvc 视图输出 变量的时候 默认使用的是 UnicodeRanges.BasicLatin  进行的编码 所以 输出中文后在查看源码的时候是进过编码了的 . 解决方案 在 Startup.cs 的 ConfigureServices() 方法中添加下面的一行代码: services.AddSingleton(HtmlEncoder.Create(UnicodeRanges.All));--------------------- 作者:megoodtoo 来源:CSDN

在mvc视图中实现rdlc报表展示(补充)

上篇: 在mvc视图中实现rdlc报表展示 在上一遍中,由于不知道如何在aspx.cs后台中实例化abp的IxxxAppService.cs的接口,我采取的方式是在视图页中把查询出的数据存储到aspx的某个隐藏域中,然后在aspx.cs的后台事件中去获取,然后再赋值给ReportViewer控件. 这种方式其实很影响性能,会多次对查询的数据做页面存储和转换,而且当数据量较大时会出现页面无法加载数据的问题. 后来才知道abp框架实际上提供了一个全局方法专门去获取当前的ioc容器集合,通过传入接口泛

python爬虫:解决请求路径中含义中文或特殊字符

一.解决请求路径中含义中文或特殊字符(/n,/t等): 1 httpurl=urllib.parse.quote(new_url, safe=string.printable)  注意:new_url必须是只有一个单引号或者双引号,如果是下面这个既有单引号,也有双引号,就会出现urlerror: new_url='"http://news.sina.com.cn/o/2017-06-08/doc-ifyfzaaq5698972.shtml"'

解决zabbix图中出现中文乱码问题

我这周部署了zabbix监控服务器,但是配置过程中发现当有中文时,图中的中文会变成方块 如下图所示: 这个问题是由于zabbix的web端没有中文字库,我们最需要把中文字库加上即可 解决办法如下: 1.从windows下控制面板->字体->选择一种中文字库例如"楷体" 2.把它拷贝到zabbix的web端的fonts目录下例如:/data/www/zabbix/fonts/,并且把TTF后缀改为ttf 3.修改zabbix的web端/include/defines.inc.

在mvc视图中实现rdlc报表展示

需求:在view视图页面中嵌入rdlc报表,rdlc的xml为动态传入的xml字符串.本项目是基于abp框架 可能出现问题: 1.rdlc报表是由asp.net的服务器控件ReportViewer来支持的,view视图不能直接使用服务器控件 2.ReportViewer需要通过aspx页面来承载,并在服务端事件中完成对控件的xml绑定.datatable绑定 3.由于是基于abp框架的项目,不能在aspx.cs后台页面中直接实例化IxxAppService接口的实现类 想达到的效果如下图: 上部

解决:IE中不能自动选择UTF-8编码的解决方法

IE中不能自动选择UTF-8编码的解决办法 在windows操作系统上使用IE作为浏览器时.常常会发生这样的问题:在浏览使用UTF-8编码的网页时,浏览器无法自动侦测(即没有设定“自动选择”编码格式时)该页面所用的编码.即使网页已经声明过编码格式: <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> ,由此造成某些含有中文UTF-8编码的页面产生空白输出. 问题分析:

解决linux系统中查看中文乱码问题

字符集就是一套文字符号及其编码.常用的字符集有:GBK 定长 双字节 不是国际标准,支持的系统不少UTF-8 非定长 1-4字节广泛支持,MYSQL也使用UTF-8当然了,字符集还有很多,以后再深入学习这部分内容. ①linux系统下的字符集由变量LANG控制. [[email protected] ~]# echo $LANG zh_CN.GB18030 ②export LANG="ZH_CN.GB18030"(临时变更字符集,重启后失效) ③在/etc/sysconfig/i18n