programing

JavaScript를 사용한 ASP.NET 포스트백

skycolor 2023. 6. 11. 10:32
반응형

JavaScript를 사용한 ASP.NET 포스트백

나는 몇 개의 작은 것을 가지고 있습니다.div용하고있는을 활용하고 s.jQuery드래그 가능한이것들div는 s 에 놓입니다에 됩니다.UpdatePanel그리고 드래그 스톱에서 나는 그것을 사용합니다._doPostBack()페이지 양식에서 필요한 정보를 추출하는 JavaScript 기능입니다.

제 문제는 이 기능을 호출하면 전체 페이지가 다시 로드되지만 업데이트 패널만 다시 로드되도록 하는 것입니다.

여기 완전한 해결책이 있습니다.

asp.net 페이지의 전체 양식 태그

<form id="form1" runat="server">
    <asp:LinkButton ID="LinkButton1" runat="server" /> <%-- included to force __doPostBack javascript function to be rendered --%>

    <input type="button" id="Button45" name="Button45" onclick="javascript:__doPostBack('ButtonA','')" value="clicking this will run ButtonA.Click Event Handler" /><br /><br />
    <input type="button" id="Button46" name="Button46" onclick="javascript:__doPostBack('ButtonB','')" value="clicking this will run ButtonB.Click Event Handler" /><br /><br />

    <asp:Button runat="server" ID="ButtonA" ClientIDMode="Static" Text="ButtonA" /><br /><br />
    <asp:Button runat="server" ID="ButtonB" ClientIDMode="Static" Text="ButtonB" />
</form>

페이지의 코드백 클래스의 전체 내용

Private Sub ButtonA_Click(sender As Object, e As System.EventArgs) Handles ButtonA.Click
    Response.Write("You ran the ButtonA click event")
End Sub

Private Sub ButtonB_Click(sender As Object, e As System.EventArgs) Handles ButtonB.Click
    Response.Write("You ran the ButtonB click event")
End Sub
  • LinkButton은 __doPostBack javascript 함수가 클라이언트에 렌더링되도록 하기 위해 포함되어 있습니다.버튼 컨트롤이 있다고 해서 이 __doPostBack 함수가 렌더링되지는 않습니다.이 기능은 대부분의 ASP.NET 페이지에 다양한 컨트롤이 있으므로 일반적으로 빈 링크 버튼이 필요하지 않습니다.

무슨 일이야?

두 가지 입력 컨트롤이 클라이언트에 렌더링됩니다.

<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
  • __EVENTTARGET__doPostBack__doPostBack의합니다.
  • __EVENTARGUMENT__doPostBack__doPostBack의합니다.

__doPostBack 함수는 다음과 같이 렌더링됩니다.

function __doPostBack(eventTarget, eventArgument) {
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
        theForm.__EVENTTARGET.value = eventTarget;
        theForm.__EVENTARGUMENT.value = eventArgument;
        theForm.submit();
    }
}
  • 보시다시피 숨겨진 입력에 값을 할당합니다.

양식 제출/포스트백이 발생할 때:

  • 버튼 ID (Unique-Control Button-Handler ID()javascript:__doPostBack('ButtonB','')그러면 해당 버튼에 대한 버튼 클릭 핸들러가 실행됩니다.

클릭 핸들러를 실행하지 않고 다른 작업을 수행하려면 어떻게 합니까?

은 여러분이 모든 로 전달할 수 있습니다.__doPostBack

그런 다음 숨겨진 입력 값을 분석하고 그에 따라 특정 코드를 실행할 수 있습니다.

If Request.Form("__EVENTTARGET") = "DoSomethingElse" Then
    Response.Write("Do Something else") 
End If

기타 참고 사항

  • 클릭 핸들러를 실행할 컨트롤의 ID를 모를 경우 어떻게 합니까?
    • 이 불가능한 경우, 경우않을 설정하는 되지 않는 .ClientIDMode="Static"과 같은할 수 : 그면다같작수수있행습다니할을업은.__doPostBack('<%= myclientid.UniqueID %>', '').
    • 또는:__doPostBack('<%= MYBUTTON.UniqueID %>','')
    • 원하는 경우 컨트롤의 고유 ID를 Javascript에 주입합니다.

파이로당:패널 이름이 변경될 경우 페이지/구성요소에서 사용합니다.

<script type="text/javascript">
     <!--
     //must be global to be called by ExternalInterface
         function JSFunction() {
             __doPostBack('<%= myUpdatePanel.ClientID  %>', '');
         }
     -->
     </script>

용사를 합니다.__doPostBack직접적으로 2000년대의 soo입니다.을 코딩하는 은 GetPostBackEventReference 을 사용합니다.

(그러나 더 심각한 것은, 이것을 완전성에 대한 답으로 추가하는 것입니다. __doPostBack직접적으로는 잘못된 관행입니다(일반적으로 단일 밑줄 접두사는 개인 구성원을 나타내고 이중은 보다 보편적인 개인 구성원을 나타냅니다). 이 시점에서는 변경되거나 사용되지 않을 수 있습니다.ClientScriptManager에는 완전히 지원되는 메커니즘이 있습니다.PostBack 이벤트 참조 가져오기)

btnRefresh가 UpdatePanel 내부에 있어 포스트백이 발생한다고 가정하면 GetPostBackEventReference를 다음과 같이 사용할 수 있습니다(영감).

function RefreshGrid() {
    <%= ClientScript.GetPostBackEventReference(btnRefresh, String.Empty) %>;
}

파이로의 해결책은 이론적으로 타당해 보이지만, 저는 또한 이 문제에 대한 다른 해결책을 찾았습니다.업데이트 패널 ID를 doPostBack 기능의 매개 변수(이벤트 대상)로 전달하면 업데이트 패널이 전체 페이지가 아닌 뒤로 게시합니다.

__doPostBack('myUpdatePanelId','')

*참고: 두 번째 매개 변수는 추가 이벤트 인수에 대한 것입니다.

이것이 누군가에게 도움이 되기를 바랍니다!

편집: 그래서 내가 타이핑할 때 위에서 같은 조언이 제공된 것 같습니다 :)

(나처럼) 이것에 문제가 있는 사람이 있다면 UseSubmitBehavior="false" 특성을 버튼에 추가하여 버튼에 대한 포스트백 코드를 얻을 수 있습니다.만약 당신이 버튼의 렌더링된 소스를 조사한다면, 당신은 당신이 실행해야 할 정확한 자바스크립트를 볼 수 있을 것입니다.제 경우에는 ID가 아닌 버튼의 이름을 사용했습니다.

업데이트 패널의 클라이언트 ID를 __doPostBack 함수에 전달해 보셨습니까?저희 팀은 업데이트 패널을 새로 고치기 위해 이 작업을 수행했으며 제가 알기로는 작동했습니다.

__doPostBack(UpdatePanelClientID, '**Some String**');

첫째, 업데이트 패널을 사용하지 마십시오.그것들은 마이크로소프트가 웹 개발자들을 위해 만든 두 번째로 가장 사악한 것입니다.

둘째, 업데이트 패널을 사용해야 하는 경우 업데이트 모드 속성을 조건부로 설정해 보십시오.그런 다음 As에 트리거를 추가합니다.페이지에 추가하는 숨겨진 컨트롤입니다.변경 이벤트를 트리거로 할당합니다.드래그 중지 이벤트에서 숨겨진 컨트롤의 값을 변경합니다.

이건 검증되지 않았지만 이론은 타당해 보입니다이것이 작동하지 않으면 asp: 버튼을 사용하여 동일한 작업을 시도하고, 디스플레이:없음 스타일을 설정하고 변경 이벤트 대신 클릭 이벤트를 사용할 수 있습니다.

전화할 수 없습니다._doPostBack()형식을 강제로 제출하기 때문입니다.당신은 왜 그것을 비활성화하지 않습니까?PostBack에서UpdatePanel?

언급URL : https://stackoverflow.com/questions/1305954/asp-net-postback-with-javascript

반응형