5

既存の ASP.NET ユーザー コントロールにカスタム JavaScript 機能を構築しています。ユーザーコントロールは、それがネストされているコントロールのプロパティについて知る必要があります。そのため、次のようなグローバル javascript 変数ではなく、expando 属性を使用することを選択しました。

Page.ClientScript.RegisterExpandoAttribute(Me.ClientID, "validatorsenabled", Me.ValidatorsEnabled)

ただし、Expando は適切にクライアントに出力されますが、usercontrol 自体には HTML に対応する要素がありません。したがって、ASP.NET によって自動生成される次の JavaScript は、「オブジェクトが null です」というエラーを受け取ります。

var ctl00_MainContentHolder_Payment_CreditCardInput1 = document.all ? document.all["ctl00_MainContentHolder_Payment_CreditCardInput1"] : document.getElementById("ctl00_MainContentHolder_Payment_CreditCardInput1");
ctl00_MainContentHolder_Payment_CreditCardInput1.validatorsenabled = "False";

少し調べてみたところ、IWebPart インターフェイスを実装することで解決できる可能性があることを示すこのページを発見しましたが、うまくいきませんでした。

ユーザーコントロールにサーバーコントロールのようなタグを出力させる方法はありますか? それとも、全体をサーバー コントロールに変換する唯一のオプションですか (この場合、これは Web サイト デザインの粒度に反します)。

他のアイデアがあれば、ユーザー コントロールで共有 JavaScript プロパティを宣言するための他の提案を受け入れます。

4

1 に答える 1

2

元の解決策の後にリストされているより良い解決策を見つけました

回避策を見つけました。

(この用語を検索したときの応答の欠如と結果の欠如により) 大多数の人々は expando の属性とその有用性を認識していないようです。検証コントロールを ASP.NET ページに追加すると、ページの下部に大量のプロパティ (有効化やエラー メッセージなど) を設定する、かなり大きく見える JavaScript ブロックが表示されます。それらは私が言及しているものです。それらは Page.ClientScript.RegisterExpandoAttribute() メソッドを使用してページに出力できます。基本的には、JavaScript で使用する追加の (意味のある) プロパティを追加できるようにしながら、マークアップを有効な HTML にするためのものです。それらは追加され、HTML DOM を介してアクセスできますが、実際には HTML にはありません。

とにかく、私の解決策に戻ります。ユーザーコントロールに2つのリテラルコントロールを追加しただけです.1つは最初に、もう1つは最後に、コードビハインドでユーザーコントロールのIDを持つコントロール要素のマークアップを追加しました(ユーザーコントロールは1つを出力しないため)。 . したがって、マークアップは次のようになります。

<%@ Control Language="VB" AutoEventWireup="false" CodeFile="CreditCardInput.ascx.vb" Inherits="BVModules_Controls_CreditCardInput" %>
<asp:Literal ID="litControlBegin" runat="server" />

<!-- User Control Content Here -->

<asp:Literal ID="litControlEnd" runat="server" />

次に、分離コードで次のようにしました。

Me.litControlBegin.Text = String.Format("<div id=""{0}"" class=""creditcardinput"">", Me.ClientID)
Me.litControlEnd.Text = "</div>"

これで、UserControl の ID (ClientID) に対応する要素が HTML に存在します。これにより、基本的に、expando 属性を追加するための一意の名前空間が得られます。また、他のコントロールがこれらの属性を簡単に識別して、ユーザー コントロールに関連付ける方法も提供されます。次に、次のコードを使用して expando 属性を追加します。

Page.ClientScript.RegisterExpandoAttribute(Me.ClientID, "validatorsenabled", Me.ValidatorsEnabled)

手動で追加した HTML 要素のおかげで、クラッシュしなくなりました。サーバー コントロールの場合のように、この詳細を処理するために配管がユーザー コントロールにあると便利ですが、この回避策は適切な代替手段です。

より良い解決策

いつものように、文字列の解析に頼る必要がある場合は、より良い方法がないかどうかを詳しく調べる必要があります。今回はたまたま、Render メソッドをオーバーライドし (サーバー コントロールと同様に)、HtmlTextWriter の組み込みメソッドを使用して出力を生成しました。

Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
    writer.AddAttribute(HtmlTextWriterAttribute.Id, Me.ClientID)
    writer.RenderBeginTag(HtmlTextWriterTag.Div)
    MyBase.Render(writer)
    writer.RenderEndTag()
End Sub

これは、他のソリューションのコードと機能的に同等です。ユーザー コントロールの ID を持つ DIV タグを生成します。ただし、オリジナルのように Page_Load に余分なコードを含める必要はなく、フレームワークをより適切に利用し、文字列の書式設定や連結を必要としません。

ここで、この行は、expando 属性 (javascript で) をユーザー コントロールに直接追加します。

Page.ClientScript.RegisterExpandoAttribute(Me.ClientID, "validatorsenabled", Me.ValidatorsEnabled)
于 2011-02-28T09:43:48.057 に答える