使用Razor的ASP.NET MVC,自定义HtmlHelper只输出文本

A B*_*gus 2 asp.net-mvc razor

我正在尝试使用自定义HtmlHelper,但是即使是基本的HtmlHelpers也无法正常工作.我的代码(仅用于测试)看起来像这样 -

我的课 -

namespace HtmlHelpers.Extensions
{
    public static class Helpers
    {
        public static string MySubmitButton(this HtmlHelper helper)
        {
            return String.Format("<input type=\"submit\" value=\"Submit This\">");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在我看来 -

@using HtmlHelpers.Extensions;
@Html.MySubmitButton()
Run Code Online (Sandbox Code Playgroud)

我相信这应该生成一个简单的提交按钮,但它只是将以下文本写入屏幕 -

<input type="submit" value="Submit">
Run Code Online (Sandbox Code Playgroud)

我检查了元素,由于某种原因,整个输入元素被双引号括起来.谁知道为什么?谢谢!

Aar*_*nLS 6

我相信你应该返回一个MvcHtmlString类.尝试

public static MvcHtmlString MySubmitButton(this HtmlHelper helper)
{
    return MvcHtmlString.Create("<input type=\"submit\" value=\"Submit This\">");
}
Run Code Online (Sandbox Code Playgroud)

虽然可能有更好的方法来使用TagBuilder如果你看一下在线的例子,或MVC源代码,因为它是开源的,你可以看看他们的html助手(尽管由于他们分层的方式,它们非常复杂).

为了直接回答你的"为什么"它的问题,就好像它是一个字符串一样,Razor试图安全并将你显示的任何内容转换为文本而不是HTML /脚本.例如,@ Model.PeronName将使用HTML字符代码转义peron名称中的任何字符.考虑是否没有这样的保护,你的一个用户改名<script>someDangerousJavascriptThatWouldChangeCurrentUsersPassword()</script>,然后发布在你的论坛或他们的名字出现的任何地方,然后其他用户访问该页面,javascript运行和POSTS更改密码表格当前用户对黑客在脚本中选择的密码的密码.像这样的各种各样复杂的攻击,或者用户可能会意外地输入尖括号(如果被视为HTML则相当无害,它们会弄乱您的页面显示).

出于这个原因,MVC将承担几乎所有的字符串不是HTML,从而取代之类的东西<script>用&lt;script&gt;,基本上是说:"这不是HTML /脚本,我希望你能显示小于号和大于号"的一种方式.如果你想以HTML形式显示某些内容,那么就有一个@Html.Raw()帮助器,它不会清理输出,因此永远不应该使用从我提供的用户的任何数据连接在一起的字符串.