Hi. I have a button that calls an Angular function that makes an http post call. Inside my C# a file is created on the server. I then want to download it to the client with Response.TransmitFile(), but it doesn't work.
Thanks. But it doesn't seem (according to http://www.w3schools.com/jsref/met_win_open.asp) that window.open can be used to send through parameters to an mvc controller. I need to pass a JSON object through. Any help?
Julian Hansen
What do you see in the console when you click the button
Is the request being generated
Are there any errors
Is there anything in the Response tab of the POST?
Prakash Samariya
Can you reply with your code snap to give answer?
Is your angularJS code runs and calls "Export" function?
Is back-end C# code calls?
Is it giving any output or errors? (snapshot please)
Please describe more in question to reply answer properly
The C# code is sending an Excel file (looks like Open Office) as an attachment with a mime-type of "application/*". A normal browser would open a "SaveAs" dialog to save the file. The request object of Angular however does not have this functionality.
The question arises as to what you want to do with the file? If it is to save locally then the suggestion by Mohit Vijay applies. If it is to be displayed on the page, then the file needs to be converted to JSON format, the C# code should not add an "attachment" header and the mime type should be set to "application/json". Then the fun starts as to how you are going to represent the file in some sort of grid.
Mohit Vijay
Hello,
You can use model window (window.open same) to pass parameters (complex object like json), but in that case it will not be pure MVC. You have to catch those parameters in in download view or page using javascript and then consume it. (eg. store those values using javascript into hidden control as runnat=server)
If you want to work with mvc, then try to use FileActionResult, it will work , but not same as above you stated.
Hardus Lombaard
ASKER
To answer BigRat: All I want to do is to save the file locally. So a "SaveAs" dialog suffices. But I need to pass parameters through to my C# Export method, because the server makes a call to the database to retrieve information. This information is then put into the Excel file that I want to download to the client.
My C# method definition:
public ActionResult Export (List<int> statuses, DateTime? month, string importerName){}
statuses will be a list (or array) of numbers. Look at my C# definition above to see how these parameters are received on the server side.
BigRat
Unfortunately I'm no good at C#, so I'm not certain what a List<int> would look like when represented as a simple URL (Name repeated lots of times? And what Name?) ImporterName and month should be straight forward when contructing the bit that goes ?month=10&importedName=John%20Doe&...
So you Need to make up a URL string and the assign that to window.location.
Unfortunately you can't do this using AJAX - due to security constraints scripting does not have access to write to the local drive.
What you can do is generate the file on the server and send back a URL to the file then redirect the browser to that file. If you set the content type correctly the file save dialog will open and the page will not redirect away.
You can also take a look at this library https://github.com/eligrey/FileSaver.js/
It basically creates a link dynamically and inserts the returned data as a BLOB, triggers a click on the link which has the same effect.
window.location.href=response.url;
Hardus Lombaard
ASKER
So on the server I create the file:
FileInfo newFile = new FileInfo(@"D:\ClientWebsites\BSWVAT404_Test\BSWVAT404_Test\hardus.xlsx");
"BSWVAT404_Test" is my Application directory, hosted in IIS.
Then I need to set the content type for "hardus.xlsx". Not sure how to do this.
Then I need to create the URL for the file. Is my following code correct?:
var url = Url.Content("~/BSWVat404_Test/hardus.xlsx");
//Create File and get FileInfoFileInfo newFile = new FileInfo(@"D:\ClientWebsites\BSWVAT404_Test\BSWVAT404_Test\hardus.xlsx");//Set content type for downloading fileResponse.AddHeader("content-disposition", "attachment;filename="+newFile.Name );Response.ContentType = "application/vnd.xls"Response.Charset = "";Response.TransmitFile(newFile.Name);Response.Flush();Response.Close();Response.End();