2011-01-28 5 views
0

중첩 ListView (Master/Detail)를 가지고 있으며이 함수가 서버 사이트에서 정적 메서드를 호출하고 필드 업데이트를 게시 할 수 있도록 ItemTemplate의 JavaScript 함수를 호출하려고합니다. 함수 호출에 세 개의 데이터 변수를 포함해야하는데, 두 개는 ListItem 데이터에서 가져와야합니다. SaveAnswer에 대한 JavaScript 호출은 내부 목록 뷰에 포함 된 목록 항목에 포함되어 있으며 올바르게 렌더링되지 않습니다. 코드는 세 개의 변수를 전달해야합니다. ThisPAQID은 코드 숨김의 공용 변수입니다. 아마이 페이지에서 숨겨진 변수로 만들 수 있습니다. QuestionID은 현재 listitem의 변수이며 SaveAnswer 메서드 호출 바로 앞의 테이블 셀에 포함됩니다.JavaScript 함수 호출의 ListItem 변수 포함

중첩 된 목록보기 위대한 작품, 그리고 함수 호출 (예 : SaveAnswer (1,1, this.Value)에 PAQID 및 QuestionID 값을 더미 경우, 그것을 잘 작동합니다.

<asp:ListView ID="lstQuestions" runat="server" OnItemDataBound="lstQuestions_ItemDataBound"> 
    <LayoutTemplate> 
    <table> 
     <asp:PlaceHolder ID="ItemPlaceholder" runat="server" /> 
    </table> 
    </LayoutTemplate> 
    <ItemTemplate> 
    <tr> 
     <td style="width: 40px;" valign="top"> 
     <asp:Label ID="lblSectionCode" runat="server" Text='<%#Eval("SectionCode")%>' />. 
     <asp:Label ID="lblSubsectionNumber" runat="server" Text='<%#Eval("SubsectionNumber")%>' /> 
     </td> 
     <td colspan="2" valign="top" style="font-size: larger; font-weight: bold; text-decoration: underline;"><%#Eval("SectionName")%></td> 
     <td valign="top" style="font-size: larger; font-weight: bold; text-decoration: underline;"><%#Eval("SubsectionName")%></td> 
    </tr> 
    <tr> 
     <th align="left">Q #</th> 
     <th align="left">Question</th> 
     <th align="left">Answer</th> 
     <th align="left">Description/Scale</th> 
    </tr> 
    <asp:ListView ID="lstAnswers" runat="server" DataKeyNames="QuestionID" OnItemDataBound="lstAnswers_ItemDataBound"> 
     <LayoutTemplate> 
     <tr id="ItemPlaceholder" runat="server" /> 
     </LayoutTemplate> 
    <ItemTemplate> 
     <tr> 
     <td style="vertical-align: top; font-weight: bold;"><asp:Label ID="lblQuestionID" runat="server" Text='<%#Eval("QuestionID")%>' /></td> 
     <td style="vertical-align: top;"><asp:Label ID="lblQuestionText" runat="server" Text='<%#Eval("Question")%>' /></td> 

기존 코드 :

<td style="vertical-align: top;"><asp:TextBox ID="txtAnswer" runat="server" Text='<%#Eval("Answer")%>' CssClass="DataEntry" MaxLength="3" Width="30px" onblur='SaveAnswer(<%#=Eval("ThisPAQID"%>,<%#=Eval("QuestionID"%>,this.value)' /></td> 

새로운 코드 :

<td style="vertical-align: top;"> 
    <asp:TextBox ID="txtAnswer" runat="server" Text='<%#Eval("Answer")%>' CssClass="DataEntry" MaxLength="3" Width="30px" /> 
    <script type="text/javascript"> 
    var textBox = document.getElementById("txtAnswer"); 
    if (document.attachEvent) { 
     document.attachEvent("onblur", textBox, function() { 
     SaveAnswer('<%#Eval("ThisPAQID")%>', '<%#Eval("QuestionID")%>', window.event.target.value); 
     }); 
    } else { 
     document.addEventListener("blur", textBox, function() { 
     SaveAnswer('<%#Eval("ThisPAQID")%>', '<%#Eval("QuestionID")%>', this.value); 
     }, false); 
    } 
    </script> 
</td> 
코드의 6,

나머지 :

<td style="vertical-align: top; font-size: -1;"><%#Eval("Description")%></td> 
    </tr> 
    <tr> 
    <td colspan="3">&nbsp;</td> 
    <td style="font-size: smaller; font-style: italic;"><%# Eval("ScaleText") %><br /><br /></td> 
    </tr> 
</ItemTemplate> 

SaveAnswer의 생성 된 코드는 이제 다음과 같습니다 : 나는 파이어 폭스에서이 코드에 중단 점을 넣어

<tr> 
    <td style="vertical-align: top; font-weight: bold;"> 
    <span id="ctl00_body_lstQuestions_ctrl0_lstAnswers_ctrl0_lblQuestionID">1</span> 
    </td> 
    <td style="vertical-align: top;"><span id="ctl00_body_lstQuestions_ctrl0_lstAnswers_ctrl0_lblQuestionText">Written materials</span> 
    </td> 
    <td style="vertical-align: top;"> 
    <input name="ctl00$body$lstQuestions$ctrl0$lstAnswers$ctrl0$txtAnswer" type="text" value="2.0" maxlength="3" id="ctl00_body_lstQuestions_ctrl0_lstAnswers_ctrl0_txtAnswer" class="DataEntry" style="width:30px;" /> 
    <script type="text/javascript"> 
    var textBox = document.getElementById("txtAnswer"); 
    if (document.attachEvent) { 
     document.attachEvent("onblur", textBox, function() { 
     SaveAnswer('13242', '1', window.event.target.value); 
     }); 
    } else { 
     document.addEventListener("blur", textBox, function() { 
     SaveAnswer('13242', '1', this.value); 
     }, false); 
    } 
    </script> 

    </td> 
    <td style="vertical-align: top; font-size: -1;">E.g., books, reports, office notes, articles, job instructions, or signs</td> 
</tr> 

, 휴식은 결코 발생하지 않습니다. 이 코드와 관련된 "OnBlur"가 필요합니까? 분명히 저는 JavaScript 마법사가 아닙니다.

답변

0

자동 생성 ID가 "ctl00_body_lstQuestions_ctrl0_lstAnswers_ctrl0_txtAnswer"이므로 Garbage + txtAnswer가 작동하지 않습니다.

거기에 대처하는 방법은 두 가지가 있습니다, 하나는 영리 뭔가 생각하거나이

<script> 
    var textBox = document.getElementById("txtAnswer"); 
    if (document.attachEvent) { 
     document.attachEvent("onblur", textBox, function() { 
      SaveAnswer(
       '<%#Eval("ThisPAQID")%>', 
       '<%#Eval("QuestionID")%>', 
       window.event.target.value 
      ); 
     }); 
    } else { 
     document.addEventListener("blur", textBox, function() { 
      SaveAnswer(
       '<%#Eval("ThisPAQID")%>', 
       '<%#Eval("QuestionID")%>', 
       this.value 
      ); 
     }, false); 
    } 
</script> 
+0

@SLaks 약간의 스크립트 태그입니다 처리 할 수 ​​jQuery

var textBox = $("[id$='txtAnswer']");

가장 쉬운 방법을 사용하여 고마워, 나는 첫 번째 실수 만 주목했다. – Raynos

+0

아직도 도움이되지 않습니다. 서버 측 컨트롤입니다. – SLaks

+0

@SLaks 그럼 나는 그 질문을 이해하지 못한다. 나는 그가 정적 PAQID 및 정적 QuestionID를 사용하여 클라이언트의 값뿐만 아니라 서버의 자바 스크립트 SaveAnswer를 호출하기를 원한다고 가정합니다. – Raynos

관련 문제