ASP.NET MVC中MvcHtmlString类的两个疑问:是什么以及怎么使用?

其实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>最终会转换成&lt;div&gt;,这样在浏览器中就会被当成普通的文本进行显示。可以看到类似<的特殊符号被进行了转义,这种操作就是进行了HTML编码。顺便罗列其他几个转义:&=&amp;"=&quot;©=&copy;

这里直接贴一段代码进行对比会比较直观点,代码在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>

结果如下:

MvcHtmlString和Html.Raw效果对比截图

可以看到序列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

(0)
上一篇 2021年8月21日
下一篇 2021年8月21日

相关推荐

发表回复

登录后才能评论