2012-11-15 1 views
1

다음은 내 컨트롤러에서 가져온 코드입니다. 내 인덱스에서 모두 시작됩니다.ASP.net MVC 3에서 생성 된 파일을 다운로드하지 않았습니다.

public ActionResult Index(...){ 
     //some code here 
     return GenerateReport(...); 
    } 

지금까지 ... exporter.GenerateReport()가 생성 된 엑셀 파일의 올바른 경로를 반환 ...

public ActionResult GenerateReport(...){ 
     string pathOfGeneratedFile = exporter.GenerateReport(...); 
     return DownloadFile(pathOfGeneratedFile, "application/vnd.ms-excel"); 
} 


public FileResult DownloadFile(string filePath, string contentType = "application/octet-stream"){ 
     return File(filePath, contentType, Path.GetFileName(filePath)); 
} 

실제로 오류가 없습니다/예외 길을 따라 일어난 ... .하지만 일단 생성 된 파일을 다운로드 할 수있을 것으로 예상 했었습니다 ... OpenXMl을 사용하여 생성 된 파일을 수동으로 열었습니다. 열려 있고 모든 정보가 거기에 저장되었습니다 ...

다음은 내보기입니다. GenerateReport 사용자 작업을 반영하기 위해 내 단추의 값을 사용하여 구문 분석을 수행했습니다. 가 생성 버튼을 클릭하면 ...이 ... 그것은 사용자의 행동을 결정하는 인덱스 작업에

<input class="btn btn-primary pull-right" type="submit" value="Generate Report" name="userAction"/> 

EDIT를 제출한다 : 나는 또한 내보기에이를 사용 ...

@using (Ajax.BeginForm(new AjaxOptions { HttpMethod = "Get", UpdateTargetId = "recordList", InsertionMode = InsertionMode.Replace })) 

BTW, 모든 작업이 완료되면 ... 내보기에서 가비지 값을 볼 수 있습니다. 파일을 다운로드하기 만하면됩니다. 고맙습니다.

+0

어쩌면 AJAX 양식을 사용하고 있습니까? –

+0

내가 편집했습니다 ... thx – JYR

답변

2

파일을 다운로드 할 수없는 이유는 AJAX 비동기 요청을 사용하고 있기 때문입니다. AJAX 응답에는 파일 다운로드가 포함될 수 없습니다. 당신은 당신의 컨트롤러에 이런 식으로 뭔가를 시도 할 수 있습니다 :

public ActionResult Index(...) { 
    var fileName = GenerateReport(); 

    // store the file name somewhere on the server - do NOT pass it through the URL. 
    this.TempData["DownloadFileName"] = fileName; 
    this.TempData["DownloadContentType"] = "application/vnd.ms-excel"; 
    this.TempData.Keep("DownloadFileName"); 
    this.TempData.Keep("DownloadContentType"); 

    return new JavaScriptResult() { Script = "document.location = \"" + this.Url.Action("Download") + "\";" }; 
} 

public ActionResult Download() { 
    return File((string)this.TempData["DownloadFileName"], (string)this.TempData["DownloadContentType"], Path.GetFileName(filePath)); 
} 

그래서 당신의 AJAX 요청 (즉, AJAX 요청 내부 리디렉션 브라우저에 원인이 때문에 RedirectToAction을 사용할 수 없습니다) 리디렉션가 발생합니다. 그런 다음이 리디렉션은 클래식 요청에서 브라우저가 파일을 다운로드하도록 지시합니다.

+0

조금 혼란스러워 ... 누가 Download()를 부르셨습니까? 여전히 GenerateReport()입니까? – JYR

+0

또한 JavaScriptResult에는 IDE에서 말하는 것과 같이 1 개의 인수를 가진 생성자가 포함되어 있지 않습니다 ... – JYR

+0

은 오류를 수정하고 발생하는 것을 설명하는 대답을 변경했습니다. –

관련 문제