2011-09-08 3 views
5

대/소문자/기본 상태로 시작하는 대시 보드가 있습니다. 사용자에게 저장된 상태를 대시 보드에로드 할 수있는 권한을 부여합니다. '적용'버튼을 클릭하면 다음 코드가 실행됩니다.다시 게시 후 양식 새로 고침시 확인 양식 다시 요청 메시지가 표시됩니다. 내가 뭘 잘못하고 있니?

function CloseAndSave() { 
    var radUpload = $find(radUpload1ID); 
    var inputs = radUpload.getFileInputs(); 

    if (inputs[0].value.length == 0) { 
     alert('Please select a dashboard to upload.'); 
     return; 
    } 

    if(!radUpload.isExtensionValid(inputs[0].value)) { 
     alert('Please select an XML file.'); 
     radUpload.clearFileInputAt(0); 
     return; 
    } 

    oWindow = null; 
    __doPostBack(radButton1ID); 
} 

protected void RadButton1_Click(object sender, EventArgs e) 
{ 
    if (RadUpload1.UploadedFiles.Count > 0) 
    { 
     UploadedFile dashboardXMLFile = RadUpload1.UploadedFiles[0]; 

     SerializableDictionary<string, string> dataToLoad = new SerializableDictionary<string, string>(); 
     XmlSerializer xmlSerializer = new XmlSerializer(dataToLoad.GetType()); 

     using (StreamReader reader = new StreamReader(dashboardXMLFile.InputStream)) 
     { 
      dataToLoad = (SerializableDictionary<string, string>)xmlSerializer.Deserialize(reader); 
     } 

     foreach (var entry in dataToLoad) 
     { 
      string sessionKey = entry.Key; 

      if (!string.IsNullOrEmpty(entry.Value)) 
      { 
       Type type = StateManager.GetTypeFromStateName(sessionKey); 

       byte[] data = Convert.FromBase64String(entry.Value); 
       using (MemoryStream memoryStream = new MemoryStream(data)) 
       { 
        xmlSerializer = new XmlSerializer(type); 
        SessionRepository.Instance.SetSession(sessionKey, xmlSerializer.Deserialize(memoryStream)); 
       } 
      } 
     } 
    } 
} 

RadButton1의 속성은 "AutoPostBack"이 false로 설정되어 있습니다. 나는 Click 이벤트를 실행하기 전에 유효성 검사를 수행하기 때문에 AutoPostBack을 false로 설정했습니다. 이제 클라이언트 측 유효성 검사를 수행 한 다음 버튼 클릭이 실행되도록 허용합니다.

RadButton1을 래핑하는 업데이트 패널이 없습니다. 따라서 RadButton1_Click 이후 전체 페이지가 게시됩니다. 이로 인해 페이지의 상태가 구문 분석 된 상태를 '로드'합니다.

페이지를 새로 고침하면 Google 크롬에 "양식 다시 제출을 확인하십시오."라고 표시됩니다. 나는이 문제를 줄이는 방법에 대해 읽었지만 근본적인 원인을 추적하려고한다.

솔루션 :

//This changes the response to a GET instead of a POST. Prevents the 'Form Resubmission' dialog. 
Page.Response.Redirect(Page.Request.Url.ToString(), true); 
+0

언제든지 양식 POST로 페이지를 제출할 때마다 브라우저 버튼 (F5 또는 무엇이든)으로 페이지를 새로 고침하면 프롬프트가 표시됩니다. 그것은 정상적인 행동입니다. 근본적인 원인은 지불을 제출하는 등의 실수로 양식을 실수로 다시 제출하는 것을 방지하기위한 브라우저의 일반적인 동작이기 때문에이를 축소해야합니다. – Nikki9696

+0

이 데이터가 자동으로 다시 제출되면 나쁜 일이 일어날 것이라고 생각합니다. POST 데이터가 삭제 된 후이를 지우는 방법을 찾아야합니다. 나는 현재 PRG에 대해 읽고있다. –

답변

10

브라우저를 새로 고침 할 때, 그것은 당신이 한 마지막 요청을 다시 보냅니다. POST 요청 인 경우 (다시 게시하는 경우처럼) 정보를 다시 게시하지만 수행하기 전에 설명하는 경고 메시지가 표시됩니다.

이 문제를 방지하는 가장 좋은 방법은 패턴을 구현한다 Post/Redirect/Get

포스트/리디렉션/가져 오기 (PRG)이에 사용자 에이전트를 특정 중복 양식 제출을 방지하고 허용하는 웹 개발자를위한 일반적인 디자인 패턴이다 북마크와 새로 고침 버튼으로보다 직관적으로 행동하십시오.

재 게시로 인해 데이터 불일치가 발생할 수있는 경우가 아니면 일반적으로 사람들은이를 구현하지 않습니다.

+0

이봐, 나는 이것에 대해 약간의 독서를했고, 그것을 구현하는 방법에 대해 혼란스러워했다. ASP.NET AJAX 예제에 대해 알고 계십니까? 나는 약간의 인터넷 검색을했지만, 대부분의 대화는 개념적이다. 적절한 조건을 발견하면 PageRequestManager의 OnResponseEnd 이벤트로 가서 페이지로 리디렉션 할 생각이었습니다. 이게 합리적이라고 생각하니? –

+0

제공하신 귀중한 정보에 대한 답변으로 표시했으나 더 많은 정보를 얻기 위해 토론을 새로운 게시물로 옮겼습니다. 고맙습니다! –

+0

@Sean Anderson : 조금 혼란 스럽네요. 아마 당신의 생각을 잘 이해하지 못했을 것입니다. RadButton1이 AJAX를 사용하지 않고 전체 페이지를 제출했다고하셨습니다. 요청에 ajax 상호 작용이 관련되지 않은 경우 왜 PageRequestManager를 사용하려고하는지 확신 할 수 없습니다. –

0

브라우저를 새로 고침하면 마지막 요청이 다시 전송됩니다. POST 요청 인 경우 (다시 게시하는 경우처럼) 정보를 다시 게시하지만 수행하기 전에 설명하는 경고 메시지가 표시됩니다.

관련 문제