2009-07-06 6 views
8

Tôi có một biểu mẫu mà người dùng phải điền và gửi. Hành động của bộ điều khiển thực hiện một số thao tác và quyết định người dùng có thể có một tệp và do đó chuyển hướng đến một hành động khác là một FilePathResult.Cách MVC đồng thời gửi một tập tin và chuyển hướng đến một trang mới là gì?

[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"); 
    } 

Điều tôi muốn làm là chuyển hướng người dùng đến trang khác nhờ người dùng tải xuống tệp nhưng tôi không chắc chắn cách thực hiện điều đó theo cách "giống MVC".

Cách duy nhất tôi có thể nghĩ ra khỏi đầu của tôi là bỏ qua hành động Tải xuống và thay vào đó chuyển hướng đến hành động ThankYou và có chế độ xem ThankYou sử dụng javascript để gửi tệp. Nhưng điều này dường như không phải là MVC đối với tôi. Có cách tiếp cận tốt hơn không?

Kết quả:

Câu trả lời được chấp nhận là đủ đúng nhưng tôi muốn cho tôi thực hiện nó.

Những thay đổi hành động Index nơi nó chuyển hướng đến:

 return RedirectToAction("Thankyou"); 

tôi đã thêm bộ điều khiển này (và xem) để hiển thị cho người dùng bất kỳ "hậu tải thông tin" và nói lời cảm ơn để tải về các tập tin. Thuộc tính AutoRefresh tôi lấy từ link text cho thấy một số sử dụng tuyệt vời khác.

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

Hành động đó được chuyển đến là cùng này như trước:

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

Trả lời

11

Chỉ cần thêm một tiêu đề để trả lời của bạn, trong hành động cho trang chuyển hướng của bạn.

Googling đã đưa ra tiêu đề này:

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

Trong trường hợp của bạn URL sẽ được thay thế bằng các URL để hành động tải của bạn

Như trang tôi đang đọc cho biết, số 5 là số giây chờ trước khi "làm mới" thành url.

Với các tập tin được tải về, nó không nên di chuyển bạn tắt trang chuyển hướng tốt đẹp của bạn :)

+0

Thanks ... câu trả lời của bạn dẫn tôi đến một số nghiên cứu khác nhau trong đó tôi tìm thấy trang này: http: //weblogs.asp.net/rashid/archive/2009/04/29/fun-with-http-headers-in-asp-net-mvc-action-filters.aspx –

+1

Thật tuyệt, tôi rất vui được giúp đỡ. Tôi thích phương pháp thuộc tính. Làm cho nó trông đẹp. Nhưng không ít MVC chỉ để thêm tiêu đề theo cách thủ công nếu bạn yêu cầu chúng. – Sekhat