2009-09-16 2 views
6

문제를 격리하기 위해 약 12 ​​개의 일반 HTML 체크 박스 (WebControls가 아닌)가 있습니다. 모두 입니다. 그들은 UpdatePanel 안에 있습니다.__DoPostback은 부분 포스트 백을 수행 할 때 비활성화 된 컨트롤의 값을 다시 게시합니다.

은 내가 제공 한 첫 번째 인수에 따라

__doPostBack('a-control','my-custom-argument');

를 호출하는 링크가 페이지 전체 postback 또는 부분 하나를 수행 할 수 있습니다.

전체 postback을 수행하면 체크 박스 값이 게시물에 전송되지 않습니다 (비활성화되어 있기 때문에). 이것은 이고 보통이므로 이 필요합니다. 동작입니다.

그러나 부분적으로 postback 일 때 스크립트는 내 체크 박스에서 모든 값을 수집하여 어떤 코드가 비활성화되었는지 나타내지 않고 내 코드를 손상시킵니다.

성가신 것처럼 일관되게 행동하고 싶습니다. 어쨌든 .NET 자바 스크립트 처리기가 나머지 세계와 다른 방식으로 작동하도록 알릴 수 있습니까? postback의 값은 HTML 양식 요소를 사용할 수 없습니까?

답변

2

나는 두 가지 옵션을 제안 할 수 있습니다.

2) Sys.WebForms.PageRequestManager.getInstance()._onFormSubmit을 수정 된 코드 버전으로 덮어 씁니다. 그냥 MicrosoftAjaxWebForms.debug.js에서 구현을 복사 disabled 속성에 대한 처리를 추가하고 기존 PageRequestManager 객체에 보정 기능을 첨부 :

Sys.WebForms.PageRequestManager.getInstance() ._ onFormSubmit = 기능 ...

다음 등록 이 JS 블록을 시작 스크립트로 사용하십시오. 렌더링 된 스크립트 블록의 올바른 순서를 얻는 것이 중요합니다. ScriptManager의 하위 클래스에서도 이와 비슷한 작업을 수행합니다.

protected override void OnResolveScriptReference(ScriptReferenceEventArgs e) { 
    base.OnResolveScriptReference(e); 

    if (e.Script.Name.StartsWith("MicrosoftAjax")) 
     Page.ClientScript.RegisterStartupScript(GetType(), "My patch", MyPatchJs, true); 
} 

매력처럼 작동합니다!

3

나에게 버그처럼 보입니다. this에 따르면 비활성화 된 입력은 이 아니며이 양식과 함께 제출되어야합니다.

<%@ Page Language="C#" AutoEventWireup="true" Inherits="System.Web.UI.Page" EnableViewState="false" EnableEventValidation="false" Trace="false" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" > 
<head> 
    <title>Test disabled checkboxes</title> 
    <script> 
    initState = false; 
    function disableCheckboxes(disabled) { 
     document.getElementById('foo').disabled = disabled; 
    } 
    </script> 
</head> 
<body> 
<form id="form1" runat="server"> 
    <asp:ScriptManager runat="server" /> 

    <asp:UpdatePanel runat="server"> 
     <ContentTemplate> 
      <input runat="server" type="checkbox" id="foo" name="foo" checked="checked" /> Foo 
      <asp:Button ID="Inside" runat="server" Text="Submit Inside UpdatePanel" /> 
     </ContentTemplate> 
    </asp:UpdatePanel> 

    <asp:Button ID="Outside" runat="server" Text="Submit Outside UpdatePanel" /> 
    <br /> 
    <button type="button" onclick="disableCheckboxes(initState=!initState)">Toggle checkboxes</button> 
</form> 
</body> 
</html> 

단계 재현 :

여기 내 전체 테스트 페이지입니다

  1. 이 피들러 및 테스트 페이지를 엽니 다.
  2. "외부 UpdatePanel 제출"을 클릭하십시오 (일반적인 포스트 백이 트리거 됨). Fiddler에서 값 "foo=on"이 POST 본문에 제출됩니다.
  3. "체크 박스 토글"을 클릭하여 체크 박스를 비활성화하십시오.
  4. "외부 UpdatePanel에 다시 제출"을 다시 클릭하십시오. "foo" 매개 변수는 POST 본문에서 생략되었습니다. 이것은 예상된다.
  5. "Submit UpdatePanel"을 클릭하십시오 (부분적인 포스트 백이 트리거 됨).그 생략 했어야 비록 ​​값 "foo=on"는 POST 체에 존재하는 주
버그가 각각 모두 MicrosoftAjaxWebForms.jsMicrosoftMvcAjax.js (및 .debug 대응 될 것으로 보인다

) :

if ((type === 'text') || 
    (type === 'password') || 
    (type === 'hidden') || 
    (((type === 'checkbox') || (type === 'radio')) && element.checked)) { 
     formBody.append(encodeURIComponent(name)); 
     formBody.append('='); 
     formBody.append(encodeURIComponent(element.value)); 
     formBody.append('&'); 
} 

직렬화되는 요소의 disabled 속성은 c 폼 제출 구현의 명세 및 사실상의 행동에 반하는 것입니다.

2

.Net. form 태그에는 submitdisabledcontrols 속성이 있으며 기본값은 false입니다. 적어도 사실대로 설정하면 행동을 일관되게 유지할 수 있습니다. 당신은 단지 포스트 백을 수행하기 전에 자바 스크립트 비활성화 컨트롤의 name 속성을 제거 할 수 있습니다

1) :

관련 문제