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

有园友在博问中提了这样一个问题 —— .NET Core 中文等非英文文字html编码输出问题,到我们的 ASP.NET Core 项目中一看,也是同样的问题。

比如下面的Razor视图代码:

@{ViewBag.Title = "代码改变世界";
}<title>@ViewBag.Title</title>

输出的html代码变成了:

<title>&#x4EE3;&#x7801;&#x6539;&#x53D8;&#x4E16;&#x754C;</title>

上面的 @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<MvcViewOptions> optionsAccessor,IModelMetadataProvider metadataProvider,IUrlHelperFactory urlHelperFactory,    HtmlEncoder htmlEncoder,ClientValidatorCache clientValidatorCache)
{
}


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

码上一行,你就知道。

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

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

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

<title>代码改变世界</title>

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


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/328461.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第4步 tomcat配置中文字符集 启动Tomcat  网页乱码

第二部&#xff1a;给页面上添加mate标签 <html> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"> <head> 然而并没什么效果。于是我就去掉这种无用的操作。换另外一种方案。 第三部&#xff1a;在tomcat的配置中…

自己动手开发编译器(我们的朋友 -- 装配脑袋走了)

编者: 昨天在微信群里得知 我们的朋友--装配脑袋(施凡老师),因白血病离我们而去,自从得病以来,施老师在积极的接受治疗&#xff0c;8.27 得到的消息还是比较让人开心的,大家都在期待着他能够重出江湖。装配脑袋一直在从事一个编译器项目,在博客园的博客里有个系列《自己动手开发…

Java Web开发与实战_Java Web开发技术与实战项目

【实例简介】北大青鸟ACCP6.0 使用JSP/Servlet/Ajax技术开发新闻发布系统第一部分课件以及代码答案1到6章【实例截图】【核心代码】7.《JavaWeb开发技术》└── 7.《JavaWeb开发技术》├── Chapter01│ ├── 01 提供给教员的内容│ │ ├── 01 教学演示案例│ │…

修改Eclipse中项目在Apache Tomcat中的部署路径

转载自 修改Eclipse中项目在Apache Tomcat中的部署路径在Eclipse中配置完服务器后&#xff0c;如果不做任何修改就去部署项目,部署后你会发现,在Apache Tomcat的webapp文件夹下并没有这个项目&#xff0c;那么项目去哪里了呢&#xff1f; 其实项目已经部署到如下默认目录…

微服务意味着分布式系统

Sander Hoogendoorn认为&#xff0c;向微服务迁移就意味着向分布式系统进行迁移&#xff0c;在这里&#xff0c;我们必须要处理延迟、认证与授权、无法到达的消息。通过使用微服务&#xff0c;我们能够将大型系统拆分为更小的组件&#xff0c;从而实现对架构的重新掌控。借助于…

在Eclipse中使用JUnit4进行单元测试(初级篇)

转载自 在Eclipse中使用JUnit4进行单元测试&#xff08;初级篇&#xff09;本文绝大部分内容引自这篇文章&#xff1a;http://www.devx.com/Java/Article/31983/0/page/1我们在编写大型程序的时候&#xff0c;需要写成千上万个方法或函数&#xff0c;这些函数的功能可能很强大…

java包 类 方法_Java中包与包之间方法的调用及其关键字区分(基础)

最近在写应用时&#xff0c;对包与包之间方法的调用不太清楚&#xff0c;专门看视频和网站后整理了这篇文章&#xff0c;希望对刚入门的同志有所帮助&#xff0c;进入主题。首先我们先简单看看Java中private、protected、public和default的主要区别&#xff1a;(看不懂没关系&a…

GitHub开源贡献榜:微软超越Facebook和Google排第一

在新任CEO萨蒂亚纳德拉的领导下&#xff0c;封闭许久的微软已于过去几年在变得更加拥抱开源。根据知名代码协作项目网站GitHub上的最新数据&#xff0c;我们发现微软已经位列开源贡献榜的第一名&#xff08;16419&#xff09;&#xff0c;超过了Facebook&#xff08;15682&…

Eclipse下导入外部jar包的3种方式

转载自 Eclipse下导入外部jar包的3种方式我们在用Eclipse开发程序的时候&#xff0c;经常要用到第三方jar包。引入jar包不是一个小问题&#xff0c;由于jar包位置不清楚&#xff0c;而浪费时间。下面配图说明3种Eclipse引入jar包的方式。1.最常用的普通操作方式:基本步骤式右击…

java速学_5分钟快速入门Java,不看真的可惜了

你好&#xff0c;世界&#xff01;源代码组织方式Java程序由packageclass组成&#xff0c;package对应目录的相对路径&#xff0c;class对应文件&#xff0c;如关于class有如下几点规则&#xff1a;文件的名字必须和class的名字一致(public级别的class名字)。文件必须只包含一个…

与微软.NET创始人Scott Guthrie面对面,“红衣教主”亲身传授推动成功转型的洪荒之力

金秋九月&#xff0c;是个即将收获的季节。微软 2016 企业技术决策论坛将于2016年9月21日在北京召开。届时&#xff0c;技术大咖Scott Guthrie 将现身论坛&#xff0c;和嘉宾们现场交流互动。 说起 Scott Guthrie&#xff0c;技术领域的人一定不陌生&#xff0c;Scott Guthrie …

第5步 配置pom.xml文件 pom文件好了就是jar包引入好了

<project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><!-- 自动生成的部分…

Tomcat启动超时问题Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds

转载自 Tomcat启动超时问题Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds使用Eclipse启动Tomcat时出现启动超时的问题如下所示&#xff1a;Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds . If the server …

xrkmonitor监控mysql_xrkmonitor字符云监控系统

下面我们对xrkmonitor字符云监控系统文件阐述相关使用资料和xrkmonitor字符云监控系统文件的更新信息。xrkmonitor字符云监控系统xrkmonitor字符云监控系统是一个国产开源监控系统&#xff0c;专注于通过监控系统对软硬件系统进行掌控以及系统相关数据的可视化&#xff0c;通过…

IDE:Eclipse查看Servlet源码

转载自 IDE&#xff1a;Eclipse查看Servlet源码一、源码下载 1、打开tomcat官网&#xff1a;http://tomcat.apache.org/ , 点击右侧下载菜单&#xff08;以tomcat-7为例&#xff09;进入下载页面&#xff1a;http://tomcat.apache.org/download-70.cgi 2、在下载页面&…

eclipse中格式化代码快捷键Ctrl+Shift+F失效的解决办法

转载自 eclipse中格式化代码快捷键CtrlShiftF失效的解决办法很长一段时间我的eclipse都有个毛病&#xff0c;就是当我要格式化代码的时候&#xff0c;右键-source-format能够起效&#xff0c;但ctrlshiftf不好使了。可以基本断定是快捷键与别的软件冲突了&#xff0c;但一直也…

解决eclipse中jsp没有代码提示问题

转载自 解决eclipse中jsp没有代码提示问题刚装的可以开发jsp的eclipse&#xff0c;结果写jsp的时候没有代码提示&#xff0c;在网上找了半天&#xff0c;各种解决办法都不行&#xff0c;后来在stackoverflow上看到一个解决办法解决了&#xff0c;其他的方法就不说了&#xff…

Cactus在jexus上安装

Cactus基于之前简单后台管理的改良版本&#xff0c;完善了权限管理&#xff0c;为后续的扩展和管理做了铺垫。 完全开放代码&#xff0c;可供学习交流 目前采用MVC4AutofacDapper制作而成&#xff0c;集成一个简单的Blog和权限系统 通过修改配置可以切换数据源&#xff08;目前…