其实MvcHtmlString
这个类在ASP.NET MVC中是经常出现的,只要是使用HtmlHelper
帮助器生成的HTML控件,最终返回的值都是一个MvcHtmlString
对象。例如在使用Razor模板引擎的视图中,使用诸如@Html.TextBox
、@Html.CheckBox
、@Html.Editor
、@Html.Hidden
这类方法生成的input元素,只要在VS中按F12查看方法定义都可以看到返回值类型是MvcHtmlString
。
关于
HtmlHelper
类这里就不再多加说明,可以自己查阅MSDN文档。
至于MvcHtmlString
类是什么,MSDN对这个类说明如下:表示当前的HTML编码字符串不应该再次被编码(Represents an HTML-encoded string that should not be encoded again.)。这里我根据自己的理解,啰嗦的说明下:假设当前的ASP.NET MVC项目的视图使用的是Razor模板引擎,默认情况下在视图中输出的字符串都会被进行HTML编码,但是如果返回的是MvcHtmlString
类,那么视图引擎就不会在对其进行HTML编码,使其保留原本的内容进行输出!
平时我们在后台中返回一段HTML代码的字符串给View视图界面,如果想要让浏览器正常的解析成HTML元素而不是普通的文本,要么使用@Html.Raw(string value)
方法进行操作,要么直接返回一个MvcHtmlString
。
HTML编码,又称为HTML转码或者HTML-Encode,如果不明白,这里举个例子:类似
<
或>
这种尖括号,是属于特殊符号,因为HTML标签都是包含在闭合的尖括号中的,例如<div>
。如果进行HTML编码,<div>
最终会转换成<div>
,这样在浏览器中就会被当成普通的文本进行显示。可以看到类似<
的特殊符号被进行了转义,这种操作就是进行了HTML编码。顺便罗列其他几个转义:&
=&
,"
="
,©
=©
。
这里直接贴一段代码进行对比会比较直观点,代码在View视图中直接使用即可;
@{
string htmlString = "<lable style=/"color:#ff0000/">十有三博客</label>";
MvcHtmlString mhs = new MvcHtmlString(htmlString);
}
<ol>
<li>@htmlString</li>
<li>@mhs</li>
<li>@Html.Raw(htmlString)</li>
<li>@HttpUtility.HtmlEncode(htmlString)</li>
</ol>
结果如下:
可以看到序列1中的HTML代码字符串是直接被当成普通的文本,输出到视图中就被做了HTML编码。而序列2使用了MvcHtmlString
进行定义,序列3使用了System.Web.Mvc.HtmlHelper.Raw(string value)
方法,这两个操作的返回结果都是一样的,都能在浏览器中将HTML标签正常的渲染出来。序列4是进行了再编码,主要是为了显示转义后的字符串,方便做对比。
额外提下Raw方法,其实查看源码就会有趣的发现,其内部的实现方法就只是返回一个
IHtmlString
接口:/// <summary> /// Wraps HTML markup in an IHtmlString, which will enable HTML markup to be /// rendered to the output without getting HTML encoded. /// </summary> /// <param name="value">HTML markup string.</param> /// <returns>An IHtmlString that represents HTML markup.</returns> [SuppressMessage("Microsoft.Performance", "CA1822:MarkMembersAsStatic", Justification = "For consistency, all helpers are instance methods.")] public IHtmlString Raw(string value) { return new HtmlString(value); }
PS:MvcHtmlString类是继承于HtmlString类
上面啰哩啰嗦讲了一大堆,都在回答是什么。下面要说的是怎么使用这个类,其实文章开头有提到过,HtmlHelper帮助器中生成HTML元素的方法都是返回MvcHtmlString
类,所以遇到需要自己扩展HtmlHelper方法的场景,建议直接返回MvcHtmlString类型而不是string
字符串类型,防止在视图中又要二次转换。
此外在项目中有需要直接返回HTML代码的也建议直接返回MvcHtmlString
类型。例如文章的内容,一般在后台使用HTML富文本编辑器编辑内容后,在前端界面肯定要原样显示,包括排版、图片、字体样式等。如果传给View的数据是string
类型,还需要用@Html.Raw
方法定义一遍,虽然这样做也可以,不过直接返回MvcHtmlString
类会让前端代码看上去更加清爽!
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/99048.html