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

时间:2013-02-19 00:20:02

标签: 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\">");
        }
    }
}

在我看来 -

@using HtmlHelpers.Extensions;
@Html.MySubmitButton()

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

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

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

1 个答案:

答案 0 :(得分:6)

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

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

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

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

出于这个原因,MVC将假设任何字符串都不是HTML,因此将<script>替换为&lt;script&gt;,这基本上是一种说法“这不是html / script,我想要你显示小于号码和大于号码“。如果你想以HTML格式显示某些内容,那么就会有一个@Html.Raw()帮助器,并且它不会清理输出,因此永远不应该使用从我提供的用户的任何数据连接在一起的字符串