3

asp.net 4に問題があります。

コントロールに属性を追加すると、それがエンコードされてレンダリングされます。

たとえば、このコードを入力すると

txtQuestion.Attributes["onfocus"] = 
    "if(this.value == this.title)
{
   this.value = '';
   this.style.backgroundColor='#FEFDE0';
   this.style.color='#000000';
}";

私はレンダリングを取得します

onfocus="if(this.value == this.title){this.value = 
'';this.style.backgroundColor='#FEFDE0';
this.style.color='#000000';}"

そして、すべての 'ハッシュは& #39;に変更されました。

一部のコントロールでのみ、この新しい未来を無効にする方法はありますか? またはカスタムレンダリングを作成する簡単な方法は?

私の失敗の試み

私はいくつかの考えを試す準備ができていますが、失敗します。たとえば、これは失敗します。

txtQuestion.RenderingCompatibility = new Version("3.5");

また、この属性がレンダリングされ、オンになっているポイントも特定します

public virtual void RenderBeginTag(HtmlTextWriterTag tagKey)関数、

エンコードしたい場合はすべての属性にフラグがありますが、誰でもそれを設定できるかどうかはわかりません。

1 つの回避策

同じ質問のaspネットフォーラムには、グローバルなEncodeTypeを変更する解決策があります-これは私が探している解決策ではありません-そして解決策を提供する人は、これは素晴らしい回避策ではなく、潜在的なセキュリティの問題があると言いますまたはその他のレンダリングの問題。

よろしくお願いします。

ケルヴィン

これまで、Kervin は Microsoft が代わりにこのコマンドを使用することを提案していることに気付きました。

txtQuestion.Attributes["onfocus"] = 
    "if(this.value == this.title){this.value = '';this.style.backgroundColor='#FEFDE0';this.style.color='#000000';}";

これを使用してください。

    Page.ClientScript.RegisterExpandoAttribute(txtQuestion.ClientID, "onfocus", 
 "if(this.value == this.title){this.value = '';this.style.backgroundColor='#FEFDE0';this.style.color='#000000';}");

そして、MS がレンダリングするものは、ページの最後にあり、JavaScript を使用してこのコントロールに onfocus を追加するスクリプトです。jQuery を使って自分でもそれを行うことができ、おそらくより互換性があります。

これは解決策ですが、属性エンコーディングを回避し、 MS の方法ではなく、自分のやり方でやりたいことを実行できる方法があるかどうかを知りたいと思っています。

4

4 に答える 4

2

この新しい ASP.NET 4 機能を使用 して、カスタム エンコーダーを作成してみましたか?

于 2010-06-02T14:37:18.363 に答える
1

オートコンプリート用のMvcHtmlHelperでこの問題が発生しました。

最終的に|〜|を使用しました 'の代わりに、Html.TextBoxが文字列をレンダリングした後、それを返す前に'に置き換えます。

これは本当に厄介な「セキュリティ」機能です。

于 2011-10-05T13:42:27.013 に答える
1

MSDN WebControl.Attributes プロパティドキュメントから...

ノート

Attributes コレクションを使用してクライアント側スクリプトを WebControl インスタンスに追加することはできません。クライアント側スクリプトを追加するには、Page コントロールの ClientScript プロパティを使用します。

問題は、コード ビハインドで設定されている場合、 Attributesがデータを予期することです。

解決策は、クライアント側のハンドラー関数を使用してクライアント スクリプトを送り返すことです。その後、関数の名前で属性を設定できます。

JavaScript が静的である場合は、コントロールが登録されるずっと前にスクリプトタグで送信できるため、処理はさらに簡単になります。

于 2010-06-05T22:21:07.033 に答える
0

パラメーターのエンコードを本当に防止したい場合は、独自のカスタマイズされたコントロールを作成し、AddAttributesToRender メソッドをオーバーライドする必要があります。使用するコントロールの種類ごとに個別のカスタム コントロールを作成する必要があるため、明らかにこれはあまり柔軟ではありません。

幸いなことに、これは非常に簡単で、数行のコードしか必要としないため、うまくいく可能性があります。カスタマイズされたボタンに必要な完全なコードは次のとおりです。

public class MyCustomButton : Button
{
    protected override void AddAttributesToRender(HtmlTextWriter writer)
    {
        base.AddAttributesToRender(writer);
        writer.AddAttribute("onclick", "myJavascriptFunction('a string');", false); // passing false to the AddAttribute method tells it not to encode this attribute.
    }
}

明らかに、これはハードコードされた onclick を属性の末尾に追加するだけであり、onclick が既に提供されている場合は干渉する可能性があります。これをさらに進めたい場合は、実際の Attributes コレクションを反復処理して、このように追加することができます。

于 2013-03-26T16:25:25.930 に答える