2012-04-19 8 views
1

したがって、アクション内でファイルをダウンロードできるようにするにはどうすればいいですか?MVC3でファイルを返すアクション

ここでは、私が持っているコントローラです。クライアントサイドをダウンロードするためのファイルを全く受け取らないことを除いて、すべてうまくいくようです。

<HttpPost()> 
    Function meetingCP(idCont As Integer, idOpp As Integer, schedule As String) As FileResult 
     Dim id As Integer = 0 
     Dim iCSFile As StringBuilder = New StringBuilder() 
     Dim startDate As Date = schedule 
     Dim endDate As Date = startDate.AddMinutes(30) 

     iCSFile.AppendLine("BEGIN:VCALENDAR") 
     iCSFile.AppendLine("VERSION:2.0") 
     iCSFile.AppendLine("METHOD:REQUEST") 

     [bla bla bla] 

     iCSFile.AppendLine("DESCRIPTION:Reminder") 
     iCSFile.AppendLine("END:VALARM") 
     iCSFile.AppendLine("END:VEVENT") 
     iCSFile.AppendLine("END:VCALENDAR") 

     Dim StreamWriter As StreamWriter = New StreamWriter("C:\MvcApplication4\MvcApplication4\Content\test.ics") 
     StreamWriter.WriteLine(iCSFile) 
     StreamWriter.Close() 


     Return File(iCSFile.ToString, "text/plain", "MeetingRequest.ics") 
     'Return File(Encoding.UTF8.GetBytes(iCSFile.ToString()), "text/plain", "MeetingRequest.ics") 
    End Function 

このアクションは、ajaxによって呼び出されます。それが問題になるかもしれませんか?

function meetCP(idCont, idOpp) { 
    var meetCPSelect = ("#meettime" + idCont); 
    var dateTime = $(meetCPSelect).val(); 
    $.ajax({ 
     url: '@Url.Action("meetingCP")', 
     type: 'POST', 
     data: { idCont: idCont, idOpp: idOpp, schedule: dateTime }, 
     success: function (result) { } 
    }); 
}; 

答えて

2

メインHTML応答からのファイルダウンロードにAJAXを使用することはできません。

これを行う方法は、目に見えないIFrameを使用し、ajax呼び出しでiframeを更新し、IFrameのsrcを送信するファイルに設定することです。

+0

だから私は、非同期のquerryが問題でした。私はあなたの選択肢が本当に好きではありません。私はユーザーにとってより直接的なものを求めています。このファイルの目的は、ユーザーに時間を稼ぐことです。そうすれば、ユーザーは1秒間待ってから再度クリックする必要があります...もっと直接的なものが必要です。私は単純なhtml投稿でそれを試してみましょう。 –

+1

ええ、公正であることは、それがポストのベストオプションであることに同意するでしょう、それはAJAXコールでちょっと乱雑になることがあります:) – mattytommo

+0

[OK]を、簡単な投稿で、ファイルのダウンロードがうまくいきます。しかし、私は今ビューからコントローラにデータを渡すことに問題があります: - (... –

2

私は言うことができませんが、あなたはその場でファイルを作成しているように見えますか?ファイルへのパスがある場合は、ファイルをダウンロードするためにこれに似た何かを使用することができます。これは私の作品:あなたのビューで

public ActionResult DownloadFile(string path, string fileName) { 
    FileContentResult result = null; 
    var file = path + fileName; 
    if (System.IO.File.Exists(file)) { 
     result = new FileContentResult(System.IO.File.ReadAllBytes(file), "application/pdf"); 
    } 
    return result; 
} 

あなたはちょうどこのような何かが必要です。

@Html.ActionLink("Your Filename", "DownloadFile", "YourController", new { path = @item.FileLocation, fileName = @item.CurrentFileName }, new { target = "blank" })    
+0

はい私はその場でファイルを作成します。あなたのコードをよく理解していれば、ファイルはいつでもダウンロード可能ですか?ファイルのエディションに問題があった場合、ユーザーはサーバー上に作成された前のファイルをダウンロードしますか?私が正しいとすれば、これは私の要求を満たしていない:-( –

0

オプション1:使用は、そのような(http://weblogs.asp.net/rajbk/archive/2010/05/03/actionresult-types-in-mvc2.aspx

FilePathResult、FileStreamResult、FileContentResultとして、ActionResultsに建てられました

オプション2:カスタムActionResultを作成してExcelファイルを返す(例:http://www.dotnetcurry.com/ShowArticle.aspx?ID=484&AspxAutoDetectCookieSupport=1

ASP.NET MVC how to make an action that return a file?

関連する問題