2

我正在尝试使用自定义 HtmlHelpers,但即使是基本的 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">

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

4

1 回答 1

6

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

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

尽管如果您查看在线示例或 MVC 源代码(因为它是开源的)可能有更好的方法来执行此操作TagBuilder,但您可以查看他们的 html 帮助程序(尽管由于它们的分层方式,它们非常复杂)。

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

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

于 2013-02-19T00:23:50.887 回答