ASP.NET에서 응답에 파일을 쓴 후 Post Back이 작동하지 않음
내가 가진 게 뭐예요?
ASP를 가지고 있습니다. 할 수 NET 이a
는 사용 파일 (RadioButtonList할 수 (한 각 에 대한 링크를 하면 안 . 이 요건입니다.사용자는 사용 가능한 파일 목록(RadioButtonList)에서 원하는 파일을 선택하고 다운로드 버튼을 클릭하여 다운로드할 수 있습니다. (다운로드할 수 있는 각 파일에 대한 링크를 제공하면 안 됩니다. - 이것이 요구 사항입니다.)
내가 원하는 게 뭐죠?
나는 사용자가 필요한 라디오 버튼을 선택하고 버튼을 클릭하여 여러 파일을 하나씩 다운로드하기를 원합니다.
제가 직면한 문제는 무엇입니까?
저는 처음으로 파일을 제대로 다운로드 할 수 있습니다.그러나 다운로드 후 다른 파일을 선택하고 버튼을 클릭하여 다운로드하면 해당 버튼의 클릭 이벤트가 게시되지 않고 두 번째 파일이 다운로드되지 않습니다.
나는 버튼 클릭 이벤트에 다음 코드를 사용합니다.
protected void btnDownload_Click(object sender, EventArgs e)
{
string viewXml = exporter.Export();
Response.Clear();
Response.AddHeader("Content-Disposition", "attachment; filename=views.cov");
Response.AddHeader("Content-Length", viewXml.Length.ToString());
Response.ContentType = "text/plain";
Response.Write(viewXml);
Response.End();
}
제가 여기서 뭘 잘못하고 있는 건가요?
IE6, IE7 및 Chrome에서도 동일한 문제가 재현될 수 있습니다.이 문제는 브라우저에 의존하지 않는 문제라고 생각합니다.
저도 쉐어포인트와 같은 문제가 있었습니다.페이지에 파일을 전송하는 버튼이 있는데 버튼을 클릭한 후 나머지 양식이 응답하지 않았습니다.이는 변수 _spFormOnSubmitCalled를 true로 설정하여 더 이상 제출하지 않도록 하는 공유 포인트입니다.파일을 보낼 때 페이지를 새로 고치지 않으므로 이 변수를 수동으로 false로 다시 설정해야 합니다.
웹 파트의 버튼에서 OnClientClick을 페이지의 Javascript에 있는 함수로 설정합니다.
<asp:Button ID="generateExcel" runat="server" Text="Export Excel"
OnClick="generateExcel_Click" CssClass="rptSubmitButton"
OnClientClick="javascript:setFormSubmitToFalse()" />
그리고 자바스크립트에는 이런 기능이 있습니다.
function setFormSubmitToFalse() {
setTimeout(function () { _spFormOnSubmitCalled = false; }, 3000);
return true;
}
제가 찾은 3초간의 일시 중지는 필요했습니다. 그렇지 않으면 쉐어포인트가 변수를 설정하기 전에 변수를 설정했기 때문입니다.이렇게 하면 Sharepoint가 정상적으로 설정되도록 한 다음 바로 false로 다시 설정합니다.
당신이 하고 있는 일은 즉시 효과가 있을 것입니다.저는 리피터와 링크 버튼을 사용했지만 과거에도 비슷한 작업을 성공적으로 수행했습니다.
내가 볼 수 있는 유일한 차이점은 당신이 사용하고 있다는 것입니다.Response.Write()
Response.OutputStream.Write()
이진법이 인데, 이고리당신이아텍쓰있고지만주, 진어를트스닌.ContentType
당신이 지정했습니다, 문제가 되지 않을 것입니다.는 로가추전, 합다니화저는다니전▁addition라고 부릅니다.Response.ClearHeaders()
정보를 전송하기 전에Response.Flush()
나중에 (내가 전화하기 전에)Response.End()
).
도움이 된다면, 다음은 제게 적합한 것에 대한 위생적인 버전입니다.
// called by click handler after obtaining the correct MyFileInfo class.
private void DownloadFile(MyFileInfo file)
{
Response.Clear();
Response.ClearHeaders();
Response.ContentType = "application/file";
Response.AddHeader("Content-Disposition", "attachment; filename=\"" + file.FileName + "\"");
Response.AddHeader("Content-Length", file.FileSize.ToString());
Response.OutputStream.Write(file.Bytes, 0, file.Bytes.Length);
Response.Flush();
Response.End();
}
파일을 바이너리 방식으로 전송하는 것을 고려해 볼 수 있습니다.System.Text.Encoding.ASCII.GetBytes(viewXml);
그리고 그 결과를 에 전달하는 것.Response.OutputStream.Write()
.
코드를 약간 수정하는 중:
protected void btnDownload_Click(object sender, EventArgs e)
{
string viewXml = exporter.Export();
byte [] bytes = System.Text.Encoding.ASCII.GetBytes(viewXml);
// NOTE: you should use whatever encoding your XML file is set for.
// Alternatives:
// byte [] bytes = System.Text.Encoding.UTF7.GetBytes(viewXml);
// byte [] bytes = System.Text.Encoding.UTF8.GetBytes(viewXml);
Response.Clear();
Response.ClearHeaders();
Response.AddHeader("Content-Disposition", "attachment; filename=views.cov");
Response.AddHeader("Content-Length", bytes.Length.ToString());
Response.ContentType = "application/file";
Response.OutputStream.Write(bytes, 0, bytes.Length);
Response.Flush();
Response.End();
}
제거하지 않고 간단하게 수행할 수 있습니다.Response.End
페이지 새로 고침을 위해 클라이언트 측 js를 추가하는 것입니다.버튼의 onclientclick 속성에 js를 추가합니다.
예.
onclientclick="timedRefresh(2000)"
then in your html..
<script type="text/JavaScript">
<!--
function timedRefresh(timeoutPeriod) {
setTimeout("location.reload(true);",timeoutPeriod);
}
// -->
제거한다.Response.End()
ASP 내에서 응답이 자연스럽게 종료되도록 합니다.NET 생태계.
그래도 안 되면 버튼을 따로 두는 것이 좋습니다.<form>
필요한 데이터를 별도의 HTTP 핸들러에 게시합니다.웹 페이지 대신 XML을 내보내도록 HTTP 처리기를 설정합니다.
저도 같은 문제가 있었어요.단순 반응을 수행하는 기능입니다.aspx 페이지의 Button Click 이벤트에서 Writer("")가 실행되지 않았습니다.
클래스의 메서드:
public test_class()
{
public test_class() { }
public static void test_response_write(string test_string)
{
HttpContext context = HttpContext.Current;
context.Response.Clear();
context.Response.Write(test_string);
context.Response.End();
}
}
ASPX 페이지:
protected void btn_test_Click(object sender, EventArgs e)
{
test_class.test_response_write("testing....");
}
이유를 찾는 동안 같은 기능을 호출했습니다.Page_Load
효과가 있었던 것입니다.
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
test_class.test_response_write("testing....");
}
}
그 문제를 조사하던 중에 asx 페이지 본문의 마스터 페이지가 아래에 있다는 것을 발견했습니다.<asp:UpdatePanel>
.
제가 제거했고, 작동했습니다.Button_Click
이벤트. 그것도 한번 확인해보시길 추천드립니다.
https://multilingualdev.wordpress.com/2014/08/19/asp-net-postback-after-response-write-work-around-solution/ 에서 확인하세요.
클라이언트에 파일을 보내고 응답을 사용하는 경우.ASP에 기입합니다.Net 개발자는 파일이 전송된 후 다른 작업을 수행할 수 없습니다.클라이언트가 파일을 받은 후 함수를 호출하는 javascript onclick 함수를 추가하는 것과 같은 다른 해결 방법이 있습니다. 이는 파일을 보낼 함수가 호출될 때 에 메타 새로 고침을 추가하는 것과 비슷합니다(예: 응답).머리글 추가("새로 고침", "5;URL=" 및 HttpContext.현재의.부탁한다.Url.AbsoluteUri)
하지만 그것들은 제가 원하는 시선을 주지 않았습니다.그래서 저는 이러한 해결 방법을 조합하여 이 솔루션을 고안했습니다.
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
checkSendFile() ‘each time page loads it will check to see if it needs to send the file
If (Not IsPostBack) Then
‘this spot is not be executed after a form submit (postback); which means you can put
‘ the checkSendFile() in here if you want
end If
End Sub
Private Sub checkSendFile()
Dim sendFile As String = Session(“SENDFILE”) ‘ first we get the session file to see if its time
‘ to send a file
If Not sendFile Is Nothing Then
If sendFile = “YES” Then
Session(“SENDFILE”) = “” ‘here we clear the session file so it doesn’t send again if
‘ refreshed
sendClientFile() ‘ function to send the file to client
End If
End If
End Sub
Protected Sub btnGetFile_Click(sender As Object, e As EventArgs) Handles btnGetFile.Click
‘this is where the client clicks on a button or link or something that submits the form and
‘ request a file to be sent to them
Session(“SENDFILE”) = “YES” ‘ we set a session variable flag
‘then we update the GUI, or run any other method that we wanted to do after client gets file
me.lblMsgToClient.text = “Thank you for downloading file.”
RefreshPage() ‘ then we refresh the page instantly (this is where post back will update values
‘ and interface, then send file)
End Sub
Private Sub RefreshPage()
‘ here we instantly add a refresh meta tag to the header with zero seconds to refresh to the
‘ same url we are currently at
Response.AppendHeader(“Refresh”, “0;URL=” & HttpContext.Current.Request.Url.AbsoluteUri)
End Sub
Private Sub sendClientFile()
‘here you will have your file and bytes to send to browser from either file system or database
‘then you can call sendToBrowser(…)
End Sub
Private Sub sendToBrowser(ByVal fileName As String, ByVal contentType As String, ByRef fileBytes As Byte())
‘this function is just the normal send file to client
Response.AddHeader(“Content-type”, contentType)
Response.AddHeader(“Content-Disposition”, “attachment; filename=” & fileName)
Response.BinaryWrite(fileBytes)
Response.Flush()
Response.End()
End Sub
언급URL : https://stackoverflow.com/questions/2336883/post-back-does-not-work-after-writing-files-to-response-in-asp-net
'programing' 카테고리의 다른 글
Angular 4에서 매트-페이지네이터를 어떻게 번역합니까? (0) | 2023.08.18 |
---|---|
MariaDB에서 프롬프트 기록을 제거할 수 있습니까? (0) | 2023.08.18 |
Twitter 부트스트랩의 트리 (0) | 2023.08.18 |
이 평균 가격 루프를 더 빠르게 수행할 수 있는 방법이 있습니까? (0) | 2023.08.18 |
X-Powered-By: ASP와 같은 IIS 사용자 정의 헤더를 삭제하는 방법응답에서 NET? (0) | 2023.08.18 |