Asp.net mvc ASP.NET MVC和Razor,自定义HtmlHelper只输出文本

Asp.net mvc ASP.NET MVC和Razor,自定义HtmlHelper只输出文本,asp.net-mvc,razor,Asp.net Mvc,Razor,我正在试验定制的HTMLHelper,但甚至连一个基本的HTMLHelper都不能正常工作。我的代码(只是为了测试)如下所示- 我的班级- namespace HtmlHelpers.Extensions { public static class Helpers { public static string MySubmitButton(this HtmlHelper helper) { return String.For

我正在试验定制的HTMLHelper,但甚至连一个基本的HTMLHelper都不能正常工作。我的代码(只是为了测试)如下所示-

我的班级-

namespace HtmlHelpers.Extensions
{
    public static class Helpers
    {
        public static string MySubmitButton(this HtmlHelper helper)
        {
            return String.Format("<input type=\"submit\" value=\"Submit This\">");
        }
    }
}
我认为这应该生成一个简单的提交按钮,但它只是将以下文本写入屏幕-

<input type="submit" value="Submit">

我检查了元素,出于某种原因,整个输入元素被双引号包围。
有人知道为什么吗?谢谢

我认为您应该返回一个MvcHtmlString类。试一试

public static MvcHtmlString MySubmitButton(this HtmlHelper helper)
{
    return MvcHtmlString.Create("<input type=\"submit\" value=\"Submit This\">");
}
public static MvcHtmlString MySubmitButton(此HtmlHelper帮助程序)
{
返回MvcHtmlString.Create(“”);
}
尽管使用
TagBuilder
可能有更好的方法来实现这一点,但是如果您在线查看示例,或者查看MVC源代码,因为它是开源的,那么您可以查看它们的html帮助程序(尽管它们由于分层的方式而非常复杂)

为了直接回答您的“为什么”问题,它将其显示为一个字符串,is Razor尝试安全地转换任何显示为文本而不是HTML/脚本的内容。例如,@Model.PeronName将使用HTML字符代码对peron名称中的任何字符进行转义。考虑一下如果没有这样的保护,你的一个用户把他们的名字改成“代码”。javascript运行并将当前用户的密码更改为黑客在脚本中选择的密码。像这样的复杂攻击有很多种,或者用户可能会意外地输入尖括号(如果将其视为HTML,则它们将破坏您的页面显示)


出于这个原因,MVC将假定几乎所有字符串都不是HTML,因此将
替换为
script
,这基本上是一种表示“这不是HTML/script,我希望您显示小于符号和大于符号”的方式。如果您想将某个内容显示为HTML,则有一个
@HTML.Raw()
帮助程序,它不会清除输出,因此不应与您从用户提供的任何数据连接在一起的字符串一起使用。

这很管用!谢谢(奇怪的是,我所看到的例子没有使用这个,我想知道为什么…-这很奇怪。我想这是MVC3中旧版本的一个变化,如果你扩展底部的注释,有人提到你必须在MVC3中返回MVCHTMLSING。
public static MvcHtmlString MySubmitButton(this HtmlHelper helper)
{
    return MvcHtmlString.Create("<input type=\"submit\" value=\"Submit This\">");
}