9

会社名をonclickイベントに渡します。一部の会社名にはアポストロフィが含まれています。company_nameフィールドに'.Replace( "'"、 "'")'を追加しました。これにより、onclickイベントを発生させることができますが、確認メッセージは「Jane'sWeldingCompany」と表示されます。

<a href="#" onclick="return Actionclick('<%= Url.Action("Activate", new {id = item.company_id}) %>', '<%= Html.Encode(item.company1.company_name.Replace("'", "&#39;")) %>');" class="fg-button fg-button-icon-solo ui-state-default ui-corner-all"><span class="ui-icon ui-icon-refresh"></span></a>

<script type="text/javascript">
function Actionclick(url, companyName) 
{
    if (confirm('This action will activate this company\'s primary company ('+companyName+') and all of its other subsidiaries.  Continue?')) 
    {
        location.href = url;
    };
};

編集 確認メッセージは&#39;を示しています 'ではなくメッセージ内。ここに入力すると、&#39;に置き換わりました。とともに '。発生しないようにスペースを追加しました。それをonclickイベントに渡す最良の方法を知りたいのですが、複数の置換を行わずにメッセージに適切に表示することもできます(より良い方法がある場合)。

4

3 に答える 3

14

私が見ているように、2つのオプションがあります。

  1. パラメータをアポストロフィ/一重引用符(')ではなく引用符( ")でラップする場合は、エスケープする必要はありません。HTMLエンコーディングは、引用符(文字列内にある場合)とアポストロフィは問題になりませんが、javascriptはすでに引用符で囲まれているため、引用符をバックスラッシュでエスケープする必要があります。例:

    onclick="return Actionclick(\"<%= Url.Action("Activate", new {id = item.company_id}) %>\", \"<%= Html.Encode(item.company1.company_name) %>\");"

  2. HTMLではなく、アポストロフィをエスケープする必要があるのは最後のjavascript文字列のみであるため、バックスラッシュは会社名をエスケープします。例えば:

    onclick="return Actionclick('<%= Url.Action("Activate", new {id = item.company_id}) %>', '<%= Html.Encode(item.company1.company_name.Replace("'", "\\'")) %>');"

于 2010-05-17T00:25:41.190 に答える
2

HTML属性値の中にJavaScript文字列リテラルがあります。

したがって、最初に値をJSエンコード('with\'\withを置き換える\\)してから HTMLエンコードする必要があります。現在、HTMLでエンコードしています'(JSエンジンが認識する前に、ブラウザがアポストロフィにデコードして戻すため、効果がありません)...次に、もう一度HTMLでエンコードして、文字通り意味を残し&#39;ます。

JSONエンコーダーを使用して、文字列(またはその他の値型)をJavaScriptリテラルに変換します。

でも。JavaScriptを文字列で書くのは、まったく面倒です。エスケープの複数のレイヤーを追跡することは、心が得意なことではありません。だからそれをしないでください。インラインイベントハンドラ属性は常に避けてください。代わりに、静的スクリプトを使用し、目立たないスクリプトを使用して、JavaScript自体からハンドラーを割り当てます。

<a class="dangerous fg-button fg-button-icon-solo ui-state-default ui-corner-all"
    href="<%= Server.HTMLEncode(Url.Action("Activate", new {id = item.company_id})) %>"
    title="This action will activate this company's primary company (<%= Server.HTMLEncode(companyName) %>) and all of its other subsidiaries."
>
    <span class="ui-icon ui-icon-refresh"></span>
</a>

(タグにjQueryがあるので、jQueryを使用します:)

<script type="text/javascript">
    $('.dangerous').click(function() {
        return confirm(this.title+' Continue?');
    });
</script>

ただし、これはの乱用であることに注意してください<a>。何かに積極的な変更を加えるアクションは、GETリクエストとして送信したり、受信を許可したりしないでください。代わりに、POSTリクエストを送信するボタンを使用する必要があります(フォームとして直接、またはAJAXを介して)。(値をテンプレート化する代わりに、ASP.NETの組み込みコントロールを使用することも検討する必要があります。これによりHTMLEncode、それほど多くの呼び出しを行う必要がなくなります。)

これがあなたを噛むことができる1つの方法については、この古典的なWTFを参照してください。

于 2010-05-17T01:08:50.377 に答える
1

私は5年後にこれに遭遇したばかりなので、私のために働いたことを共有します。

MSDNでHttpUtility.JavaScriptStringEncodeを確認してください

これを使用して、プロパティの値を設定するときにサーバー側で文字列をエンコードできます。これにより、アポストロフィのユニコード表現( "\ u0027")が生成され、JavaScriptのonclickに渡すことができます。

元の例の場合:

item.company1.company_name = HttpUtility.JavaScriptStringEncode("Jane's Welding Company");

となります

"Jane'\u0027s Welding Company"

HttpUtility.JavaScriptStringEncodeに関する注意-二重引用符で文字列をエンコードするブール値を指定することを選択できます(bool addDoubleQuotes)。ただし、この文字列はJavaScript関数のパラメーターとして使用されるため、余分な引用符は必要ありません。

于 2015-08-05T22:23:52.753 に答える