2009-07-06 6 views
8

사용자가 작성하여 제출해야하는 양식이 있습니다. 컨트롤러 동작은 일부 작업을 수행하고 사용자가 파일을 가질 수 있으므로 FilePathResult 인 다른 동작으로 리디렉션합니다. 내가하고 싶은 무엇동시에 파일을 보내고 새 페이지로 리디렉션하는 MVC 방법은 무엇입니까?

[CaptchaValidator] 
    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Index(FormCollection collection) 
    { 
     // do some stuff ... 
     return RedirectToAction("Download"); 
    } 


    [AcceptVerbs(HttpVerbs.Get)] 
    public FilePathResult Download() 
    { 
     var fileName = "c:\foo.exe"; 
     return File(fileName, "application/octet-stream", "installer.exe"); 
    } 

다른 페이지로 사용자를 리디렉션되는 감사 파일을 다운로드하지만 난 "MVC 같은"방식으로 그것을 달성하는 방법을 잘 모르겠어요 대한 사용자.

내 머리 꼭대기에서 생각할 수있는 유일한 방법은 다운로드 작업을 건너 뛰고 대신 ThankYou 동작으로 리디렉션하고 ThankYou보기에서 자바 스크립트를 사용하여 파일을 보도록하는 것입니다. 그러나 이것은 단지 MVC가 아닌 것 같습니다. 더 나은 접근 방법이 있습니까?

결과 :

허용 대답이 충분히 정확하지만 난 그것을 구현 보여주고 싶었다.

가로 리디렉션 인덱스 액션 변경 :

 return RedirectToAction("Thankyou"); 

내가 어떤 "포스트 다운로드 정보"사용자를 표시하고 파일을 다운로드 감사의 말씀을이 컨트롤러 (볼)를 추가합니다. 필자가 link text에서 얻은 AutoRefresh 특성은 다른 우수한 사용법을 보여줍니다.

[AutoRefresh(ControllerName="Download", ActionName="GetFile", DurationInSeconds=3)] 
    [AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult Thankyou() 
    { 
     return View(); 
    } 

하기 전의이 동일 할 리디렉션 동작 :

[AcceptVerbs(HttpVerbs.Get)] 
    public FilePathResult GetFile() 
    { 
     var fileName = "c:\foo.exe"; 
     return File(fileName, "application/octet-stream", "installer.exe"); 
    } 

답변

11

그냥 리디렉션 된 페이지의 행동에, 당신의 응답에 헤더를 추가합니다.

인터넷 검색이 헤더를 내놓았다 : 귀하의 경우

Refresh: 5; URL=http://host/path 

URL을 다운로드 작업을 내가 읽고 있던 페이지가 말한대로

에 URL로 대체 될 것이다, 숫자 5는이다 url에 "새로 고침"되기까지 대기하는 시간 (초)입니다. HTTP :

+0

감사합니다 ... 당신의 대답은 내가이 페이지를 찾을 수있는 몇 가지 다른 연구에 저를 이끌어 :) 다운로드되는 파일로

, 당신의 좋은 리디렉션 페이지 떨어져 당신을 이동하지 않아야 : //weblogs.asp.net/rashid/archive/2009/04/29/fun-with-http-headers-in-asp-net-mvc-action-filters.aspx –

+1

멋지고 도움이 될 수있어서 기쁩니다. 나는 속성 메소드를 좋아한다. 계속 멋지게 지켜줍니다. 그러나 필요한 경우 수동으로 헤더를 추가하는 것은 MVC가 아닙니다. – Sekhat

관련 문제