Mam połączenie AJAX do kontrolera, aby uzyskać dane oddzielone przecinkami w następującym formacie,

public ActionResult GetSearchDataforDownloadtoCSV(string pSearchbykeyword, string pRequestCode)
{
   ReportsBE _lReportsBE = new ReportsBE();
   _lReportsBE.SearchKeyword = pSearchbykeyword;
   _lReportsBE.RequestCode = pRequestCode;

     List<ReportsBE> lstResult = new List<ReportsBE>();
     lstResult = _objReports.GetPackagelistAll_Search(_lReportsBE);

    StringBuilder sb = new StringBuilder();
    sb.Append("Request");
    sb.Append(",");
    sb.Append("Description");
    sb.Append("\n");

    foreach (var _RepBE in lstResult)
    {

        if (_RepBE.RequestCode != null)
        sb.Append(Escape(_RepBE.RequestCode));
        sb.Append(",");
        if (_RepBE.Description != null)
        sb.Append(Escape(_RepBE.Description));

        sb.Append("\n");
    }

return Json(sb.ToString());
}

To jest mój HTML,

@Html.LabelFor(model => model.SearchKeyword, "Search Packages by Keyword")
@Html.TextBoxFor(model => model.SearchKeyword, new { style = "width: 500px;" })

<button type="button" id="btnExport" onclick="DownloadCSV()" value="Export to CSV">Export to CSV</button>

To jest moje połączenie Ajax,

function DownloadCSV() {
        var _pSearchbykeyword = $('#SearchKeyword').val();
        var _pRequestCode = $('#RequestCode').val(); 

        var postData = {
            pSearchbykeyword: _pSearchbykeyword == '' ? '' : _pSearchbykeyword
            , pRequestCode: _pRequestCode == '' ? '' : _pRequestCode
        };

        $.ajax({
            type: 'POST',
            url: '@Url.Action("GetSearchDataforDownloadtoCSV", "Reports")',
            data: postData,
            success: function (data) {
                if (data != null) {
                    // need to code here to through comma seperated data as csv file...
                }
            },
            error: function (xhr, ErrorText, thrownError) {
                alert("No Records Found!");

            }
        });

    }

Mój problem polega na pobraniu rozdzielonego przecinka ciąg zwrócony z kontrolera jako plik .csv. Życzliwa pomoc.

Próbowałem przez plik jak poniżej,

var uri = 'data:text/csv;charset=utf-8,' + escape(data);
var downloadLink = document.createElement("a");
downloadLink.href = uri;
downloadLink.download = "SearchList.csv";
document.body.appendChild(downloadLink);
downloadLink.click();
document.body.removeChild(downloadLink);

Ten kod pracuje w Chrome, ale nie w IE z powodu ograniczenia ciągu zapytań. Każda pomoc byłaby naprawdę doceniona. dzięki.

0
Gnanasekaran Kuppusamy 20 listopad 2013, 10:37

3 odpowiedzi

Najlepsza odpowiedź

Osobiście wykorzystywałbym typ działania FileResult zamiast ogólnej metody {X1}}:

    public FileResult Download(long id)
    {
        var fileData = GetSearchDataforDownloadtoCSV(...);
        // use application/octet-stream for file downloads, saves us needing to
        // infer MIME type
        return File(fileData, "application/octet-stream", "Filename.csv");
    }

W ten sposób nie musisz w ogóle używać AJAX.

0
Richard A. 20 listopad 2013, 11:05

Nie używaj AJAX, ale standardowy html <form>:

@using (Html.BeginForm("GetSearchDataforDownloadtoCSV", "Reports"))
{
    @Html.LabelFor(model => model.RequestCode, "Request Code")
    @Html.TextBoxFor(model => model.RequestCode, new { style = "width: 500px;" })


    @Html.LabelFor(model => model.SearchKeyword, "Search Packages by Keyword")
    @Html.TextBoxFor(model => model.SearchKeyword, new { style = "width: 500px;" })

    <button type="submit" value="Export to CSV">Export to CSV</button>
}

Powodem, dla którego nie można pobrać plików za pomocą żądania AJAX, jest to, że nie masz możliwości pokazania okna dialogowego Zapisz jako JavaScript. Więc nic nie możesz zrobić w oddzwonieniu sukcesu Ajax, aby wyświetlić użytkownika, aby zapisać plik. Dlatego najłatwiejszym rozwiązaniem jest użycie standardowego formularza lub kotwicy wskazującym bezpośrednio do akcji kontrolera, która będzie obsługiwać plik CSV.

2
Darin Dimitrov 20 listopad 2013, 09:24

Tak rozwiązałem zgodnie z Darin Dimitrov & Richard A. Komentarze,

public FileResult GetSearchDataforDownloadtoCSV(string pSearchbykeyword, string pRequestCode)
{
   ReportsBE _lReportsBE = new ReportsBE();
   _lReportsBE.SearchKeyword = pSearchbykeyword;
   _lReportsBE.RequestCode = pRequestCode;

     List<ReportsBE> lstResult = new List<ReportsBE>();
     lstResult = _objReports.GetPackagelistAll_Search(_lReportsBE);

    StringBuilder sb = new StringBuilder();
    sb.Append("Request");
    sb.Append(",");
    sb.Append("Description");
    sb.Append("\n");

    foreach (var _RepBE in lstResult)
    {

        if (_RepBE.RequestCode != null)
        sb.Append(Escape(_RepBE.RequestCode));
        sb.Append(",");
        if (_RepBE.Description != null)
        sb.Append(Escape(_RepBE.Description));

        sb.Append("\n");
    }

byte[] buffer = System.Text.Encoding.UTF8.GetBytes(sb.ToString());
return File(buffer, "text/csv", "SearchList.csv");
}

Iw moim javascript,

function DownloadCSV() {
        var _pSearchbykeyword = $('#SearchKeyword').val();
        var _pRequestCode = $('#RequestCode').val();

        pSearchbykeyword= _pSearchbykeyword == '' ? '' : _pSearchbykeyword;
        pRequestCode = _pRequestCode == '' ? '' : _pRequestCode;

        window.location = "Reports/GetSearchDataforDownloadtoCSV?pSearchbykeyword=" + pSearchbykeyword + "&pRequestCode=" + pRequestCode;
    }

To działa jak urok .... :)

0
Gnanasekaran Kuppusamy 21 listopad 2013, 12:51