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

TagBuilderオンラインの例、またはオープンソースであるためMVCソースコードを見ると、おそらくこれを行うより良い方法がありますが、それらのhtmlヘルパーを見ることができます(ただし、レイヤーの方法によりかなり複雑です)。

「なぜ」それが文字列であるかのように表示されていたという質問に直接答えるために、Razor は安全を確保し、HTML/スクリプトではなくテキストとして表示するものを変換しようとします。たとえば、@Model.PeronName は、ペロンの名前に含まれるすべての文字を HTML 文字コードでエスケープします。このような保護がなく、ユーザーの 1 人が自分の名前を に変更し<script>someDangerousJavascriptThatWouldChangeCurrentUsersPassword()</script>、フォーラムまたは名前が表示される場所に投稿し、他のユーザーがそのページにアクセスし、JavaScript が実行されてパスワード変更フォームを投稿した場合を考えてみましょう。その現在のユーザーのパスワードを、ハッカーがスクリプトで選択したパスワードに変更します。このような複雑な攻撃にはさまざまなものがあり、ユーザーが誤って山括弧を入力することもあります (HTML として扱われるとかなり無害ですが、ページの表示が台無しになります)。

そのため、MVC はほぼすべての文字列が HTML ではないと想定し、基本的に「これは html/script ではありません。小なり記号と大なり記号を表示してほしい」というようなものを置き換え<script>ます&lt;script&gt;。何かを HTML として表示したい場合は、@Html.Raw()そのためのヘルパーがあり、出力をクリーンアップしないため、ユーザーが提供したデータから連結した文字列と一緒に使用しないでください。

于 2013-02-19T00:23:50.887 に答える