Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么是MvcHtmlString?我应该在什么时候使用它?_C#_Asp.net Mvc - Fatal编程技术网

C# 什么是MvcHtmlString?我应该在什么时候使用它?

C# 什么是MvcHtmlString?我应该在什么时候使用它?,c#,asp.net-mvc,C#,Asp.net Mvc,forMvcHtmlString并不是很有启发性: 表示不应再次编码的HTML编码字符串 我不清楚这到底意味着什么。似乎有些HTML助手方法返回一个MvcHtmlString,但我在网上看到的几个自定义助手示例只返回一个常规字符串 问题: 什么是MvcHtmlString 什么时候我应该选择MvcHtmlString而不是string,反之亦然?为什么?如果希望将原始HTML传递给MVC帮助程序方法,而不希望帮助程序方法对HTML进行编码,则可以使用MVCHTMLSING。ASP.NET 4引入

for
MvcHtmlString
并不是很有启发性:

表示不应再次编码的HTML编码字符串

我不清楚这到底意味着什么。似乎有些HTML助手方法返回一个
MvcHtmlString
,但我在网上看到的几个自定义助手示例只返回一个常规字符串

问题:

什么是
MvcHtmlString


什么时候我应该选择
MvcHtmlString
而不是
string
,反之亦然?为什么?

如果希望将原始HTML传递给MVC帮助程序方法,而不希望帮助程序方法对HTML进行编码,则可以使用
MVCHTMLSING

ASP.NET 4引入了新的代码块语法
。本质上,
转换为
。该团队正试图让开发人员尽可能使用
而不是
来防止XSS

但是,这引入了一个问题,即如果代码块已经对其结果进行了编码,
语法将对其进行重新编码。通过引入IHtmlString接口(在.NET4中新增)解决了这一问题。如果
中的foo()返回IHtmlString,
语法将不会对其重新编码

MVC2的助手返回MvcHtmlString,它在ASP.NET 4上实现接口IHtmlString。因此,当开发人员在ASP.NET4中使用
时,结果不会被双重编码

编辑:


这种新语法的一个直接好处是,您的视图更加清晰。例如,您可以编写
而不是

如果您想制作自己的
HtmlHelper
扩展,那么这是一个很好的实用方法。例如,我讨厌尝试记住
标记语法,因此我创建了自己的扩展方法来创建
标记:

<Extension()> _
Public Function CssBlock(ByVal html As HtmlHelper, ByVal src As String, ByVal Optional ByVal htmlAttributes As Object = Nothing) As MvcHtmlString
    Dim tag = New TagBuilder("link")
    tag.MergeAttribute("type", "text/css")
    tag.MergeAttribute("rel", "stylesheet")
    tag.MergeAttribute("href", src)
    tag.MergeAttributes(New RouteValueDictionary(htmlAttributes))
    Dim result = tag.ToString(TagRenderMode.Normal)
    Return MvcHtmlString.Create(result)
End Function
_
公共函数CssBlock(ByVal html作为HtmlHelper,ByVal src作为String,ByVal可选ByVal htmlAttributes作为Object=Nothing)作为MvcHtmlString
尺寸标记=新标记生成器(“链接”)
tag.MergeAttribute(“类型”、“文本/css”)
tag.MergeAttribute(“rel”、“样式表”)
tag.MergeAttribute(“href”,src)
tag.MergeAttributes(新的RouteValueDictionary(htmlAttributes))
Dim结果=tag.ToString(TagRenderMode.Normal)
返回MvcHtmlString.Create(结果)
端函数
我本可以从这个方法返回
String
,但如果我有以下内容,就会中断:


使用
MvcHtmlString
,使用
都可以正常工作。

这是一个迟来的答案,但如果有人阅读此问题时使用的是razor,您应该记住razor默认情况下会对所有内容进行编码,但是通过在html助手中使用
MvcHtmlString
,您可以告诉razor它不需要对其进行编码

如果希望razor不编码字符串,请使用

@Html.Raw("<span>hi</span>")
“HtmlString仅存在于ASP.NET 4中

MvcHtmlString是添加到MVC 2中的一个兼容性垫片,用于支持.NET 3.5和.NET 4。现在MVC 3仅支持.NET 4,它是HtmlString的一个相当简单的子类,可能用于MVC 2->3以实现源代码兼容性。”

Hmm…我认为HTML助手方法的全部要点是编码HTML。如果使用HTML助手方法,我会怎么做?除此之外,我什么时候希望从HTML助手方法返回
MvcHtmlString
?传递到或从返回。如果你的HTML助手生成了预先转义的HTML,而你不希望其他人重新转义它,那么你可能会想要返回一个。好吧,我想这让我更接近了,但是(冒着被认为是个聪明人的风险)我如何决定是否要其他人重新转义它?让某人处理转义html通常是好的还是坏的做法?我以前从未见过这样的构造。“它就像一个字符串,但请不要碰它…并不是说有任何东西阻止你碰它,但我们希望你不要碰它。”这是怎么回事?关键是,与常规字符串不同,这个字符串已经被编码了。因此,没有必要去碰它。我要补充的是,MVC2是根据.NET3.5而不是4编译的。这意味着
MvcHtmlString
没有实现
IHtmlString
,因为它只存在于4中。
I stand corrected-实际上是
MvcHtmlString.Create
方法检测
IHtmlString
是否可用,并动态创建返回类以支持它(如果可用):Follow-Up:MvcHtmlString和HtmlString之间是否存在有意义的差异?在阅读了上面链接的文档之后,我仍然不知道MvcHtmlString给了我什么HtmlString没有给我的。@Flip疑惑-没有什么有意义的区别。两者之间有一个非常细微的区别。如果传递空字符串,MvcHtmlString将在ToString()或ToHtmlString()中返回String.Empty。HtmlString将继续返回null。我投票支持文档的链接:D这对我有好处。非常感谢。
public IHtmlString Raw(string value) {
    return new HtmlString(value); 
}