1

そのため、ASP.NET ユーザー コントロールの正しい clientID 属性へのアクセスに問題があります。

私の主な質問は、VB コード ビハインドを使用してコントロールの完全な ClientID フィールドを返そうとしていることです。私のコントロール(およびブラウザに表示されるもの)の期待値は次のとおりです。

  • ctl00_ContentPlaceHolder1_ctl05_txtAnswer

しかし、コードビハインドで「txtAnswer」しか取得していません。

私はここでSOで似たようなものを見つけました:

ASP.Net: ユーザー コントロールのコード ビハインドで ClientID が正しくない

この投稿では、onPreRender または onPageLoad などの間に onClick イベントを追加することを提案していますが、他の状況があります。

  • 私のユーザー コントロール (テキスト ボックス) は、データベースから値を「事前に読み込む」ように設計されています (同じユーザーが以前にフォームにアクセスしようとした場合)、または isPostBack == true の場合。

  • DB から回答を読み取っているため、また JS 関数 ( getElementByID() JS 関数を使用する) があるため、コントロールはユーザー データにアクセスする必要があります ...

  • 現在、コントロールには、データベースから特定の質問をロード するメンバー関数loadQuestions(key parameters)があります。

  • 詳細情報: (クライアント ASPX ファイルに) コントロール要素がハードコーディングされていた古いコードを更新していますが、現在、コントロールは実行時に動的に構築されています (つまり、クライアント ページのプレースホルダーに挿入されています)。

  • さまざまな ClientIDMode 設定をいじってみました ( http://msdn.microsoft.com/en-us/library/system.web.ui.clientidmode.aspxごと) が、これまでのところダイスはありません... 私は使用しています.NET 4.0なので、「静的」clientIDmodeを介してClientIDを直接編集できることは理解していますが、まだ試していません...

現在、すべてのコンテンツ定義のものをオブジェクトのコンストラクターに「フロントロード」する必要があると考えています。これにより、すべてのコンテンツ定義のものを適用し、コントロールのデータが作成された後に onClick 属性を確立します。人口?

参考のため:

コントロールの ASP マークアップは次のとおりです。

<%@ Control Language="VB" AutoEventWireup="false" CodeFile="RBHorizWithText.ascx.vb" Inherits="Apps_Controls_RBHorizWithText" %>
<%@ Register Assembly="txtBoxLengthValidator" Namespace="txtBoxLengthValidator" TagPrefix="cc1" %>

<asp:Panel ID="pnlPreamble" runat="server">
    <div id="divPreamble" runat="server" style="padding-bottom:15px"></div>
</asp:Panel>

<asp:Panel ID="pnlQuestion" runat="server">
    <div id="divQuestion1" runat="server"></div>



    <div id="divRBL" runat="server"  style="padding-left: 20px"> 
      <asp:Table ID="tblAnswers" runat="server" CellPadding="0" CellSpacing="0">
      </asp:Table>
    </div>

    <div id="divQuestion2" runat="server" style="padding-left: 20px; padding-top: 10px"></div>
    <div id="divAnswer2" runat="server" style="padding-left:20px; padding-top: 5px; text-align: left" align="left">
        <div>
            <cc1:TextBoxLengthValidator 
                ID="tblvAnswer" 
                    ControlToValidate="txtAnswer" 
                    runat="server" 
                    ErrorMessage="Maximum length is 255 Characters" 
                    MaximumLength="255" 
                    Display="Dynamic"
                    ForeColor="Red">
            </cc1:TextBoxLengthValidator>    
        </div>

        <div><asp:TextBox ClientIDMode = "Predictable" ID = "txtAnswer" runat="server" Width="600px" Rows="3" TextMode="MultiLine"></asp:TextBox></div>

    </div>

</asp:Panel>

そして、これがJS関数を呼び出すVBコードビハインド(簡潔にするために編集)の関数です...

Public Sub LoadQuestions(ByVal objQRBL As Question, ByVal objQText As Question, ByVal dicAnswers As Dictionary(Of Integer, QuestionAnswer), ByVal LoadAnswers As Boolean)
        'This is a function from RBHorizWithText user control that has two member controls: a radio button and a text box (first 2 params).
        'dicAnswers are the user's answers stored either in HttpContext.Current, or as global memory objects...


        _lstRadioButtons = New List(Of RadioButton)
        Me.tblAnswers.Rows.Clear()
        'txtAnswer is a member control of type textBox...
        Me.txtAnswer.Text = String.Empty

        '.
        'Stuff to build out <tr> and <td> question display elements to format/store control...
        '.


        Dim trw As New TableRow
        Dim iCount As Integer = 0

        For Each objA As QuestionAnswer In objQRBL.AnswerList           

            Dim objRB As New RadioButton

            objRB.ID = objA.QuestID & ";" & objA.AnswerID
            objRB.GroupName = "rb" & objA.QuestID
            objRB.Text = objA.AnswerText

            'This is the main area where I'm having trouble:  
            '   At runtime, Me.txtAnswer.ClientID should evaluate to: "ctl00_ContentPlaceHolder1_ctl05_txtAnswer"
            '   Instead I'm getting:    "txtAnswer"

            If objQText.ParentReqResponseCode.IndexOf(";" & objA.ResponseCode & ";") <> -1 Then
                objRB.Attributes.Add("onclick", "txtBoxEnable('" & Me.txtAnswer.ClientID & "');")
            Else
                objRB.Attributes.Add("onclick", "txtBoxDisable('" & Me.txtAnswer.ClientID & "','" & objQText.InnerText & "');")
            End If


            tcl.Controls.Add(objRB)
            trw.Cells.Add(tcl)

            _lstRadioButtons.Add(objRB)

            iCount += 1
        Next

        'Other stuff to handle formatting and behavior of other controls...

    End Sub

プロジェクトのマスターページに存在するJS関数は次のとおりです。

function txtBoxEnable(elID) {                     
    var el = document.getElementById(elID);
    el.style.backgroundColor = '#f4df8d';
    el.value = '';
    el.disabled = '';           
}

function txtBoxDisable(elID, innerText) {
    var el = document.getElementById(elID);
    el.value = innerText;
    el.style.backgroundColor = '#ffffff';
    el.disabled = 'disabled';
}

どうもありがとう!-ルイス

4

1 に答える 1

1

さまざまな ClientIDMode 設定をいじってみました ( http://msdn.microsoft.com/en-us/library/system.web.ui.clientidmode.aspxごと ) が、これまでのところサイコロはありません... 私は使用しています.NET 4.0なので、「静的」clientIDmodeを介してClientIDを直接編集できることは理解していますが、まだ試していません...

それを試してみてください、それはあなたの問題を完全に解決します. マークアップで割り当てた ID は、サーバー側で取得する ID になります。ID の前に不要なゴミを追加しません。

于 2012-08-10T20:25:24.347 に答える