2016-03-01 49 views
0

我已经我发现下面的ASP.NET 4代码,我试图转换为ASP.NET 5 RC1/ASP.NET核心文件没有返回到ASP.NET MVC视图,但我看不出为什么?

public async Task MyActionName(MyViewModel viewModel) 
{ 
    //some stuff 
    int accountId=1; 

    string _contentDisposition = 
    string.Format("attachment; filename=portfolio-inquiry-{0}.xlsx", 
    accountId.ToString()); 

    Response.ContentType = 
    "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
    Response.AddHeader("content-disposition", _contentDisposition); 
    Response.BinaryWrite(_xlPackage.GetAsByteArray()); 
} 

有一个GitHub answer posted,说了ASP.NET 5我需要使用

await context.Response.Body.WriteAsync(buffer, 0, buffer.Length); 

所以我改变它为ASP.NET 5(不知道这是否是正确的)

public async Task MyActionName(MyViewModel viewModel) 
{ 
    //some stuff 
    int accountId=1; 

    string _contentDisposition = 
    string.Format("attachment; filename=portfolio-inquiry-{0}.xlsx", accountId.ToString()); 

    var buffer = _xlPackage.GetAsByteArray(); 
    await HttpContext.Response.Body.WriteAsync(buffer, 0, buffer.Length); 

} 

我的看法是这样的

<form action="@(Url.Action("MyActionName", "Controller"))" data-ajax="true" data-ajax-method="POST" method="post"> 
    //form inputs 
    <button type="submit" class="btn btn-primary">Get file</button> 
</form> 

并且代码无错地运行。然而,因为HttpContext.Response.Body.WriteAsync或旧的返回是无效的,我不知道如何将它返回到我的MVC视图,因为上述代码正确运行,但因为它不返回任何视图,视图不会得到文件。

我已经运行Fiddler来查看是否有任何东西从控制器发送到浏览器,但没有任何东西。在Visual Studio中,我可以遍历所有代码。 我认为一个可能的问题是,因为ASP.NET 5没有Response.AddHeader方法,所以我排除该行以查看它是否仍然有效。

然后我试图通过chaning

return File(buffer, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); 

将其转换为一个文件,并发送回视图,并改变了我的方法的返回类型为async Task<FileResult>

但是结果仍然是一样的。通过控制器编码步骤,但不返回任何内容到视图。提琴手什么都没收。调试没有错误。 JavaScript控制台不会引发错误。

+0

您正在下载的文件作为附件,你不应该需要将其返回到视图。没有Ajax的正常表单提交应该为此工作。 – Rhumborl

+0

[将文件返回到ASP.NET MVC中查看/下载]可能的重复(http://stackoverflow.com/questions/5826649/returning-a-file-to-view-download-in-asp-net-mvc ) –

+0

使用[File](https://msdn.microsoft.com/en-us/library/system.web.mvc.controller.file(v = vs.118).aspx)方法重载之一返回FileResult 。视图仅用于渲染。当您想要返回Json,文件或其他表示形式时,您需要返回适当的Result实例 –

回答

0

我做了一件非常愚蠢的。

我的窗体已经启用了不显眼的ajax,并且我从来没有处理过返回ajax返回。

如果返回一个文件,你不需要做一个正常POST的ajax POST。

我改变了我的形式

<form action="@(Url.Action("MyActionName", "Controller"))" data-ajax="true" data-ajax-method="POST" method="post"> 

<form action="@(Url.Action("MyActionName", "Controller"))" method="post"> 

和它的作品

0

你可以试试这个:

public async Task MyActionName(MyViewModel viewModel) 
{ 
    //some stuff 
    int accountId=1; 

    string _contentDisposition = string.Format("attachment; filename=portfolio-inquiry-{0}.xlsx", accountId.ToString()); 

    Response.Clear(); 
    Response.BufferOutput = true; 
    Response.Buffer = true; 
    Response.AddHeader("content-disposition", _contentDisposition); 
    Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
    Response.BinaryWrite(_xlPackage.GetAsByteArray()); 
    Response.End(); 

    //redirect to where you want to be seen in view. 
    return Redirect("Index"); 
} 
+0

我的代码与使用ASP.net 5的代码略有不同。但是我添加了重定向,但它仍然不会发送文件 – greay

相关问题