Генерировать и загружать CSV-файл, передавая параметры в метод контроллера в C# MVC

У меня есть метод GenerateCSV(строка accountNumber, строка dt1, строка dt2) в моем ReportController

Как мне инициировать этот запрос из моего Report.cshtml?

 <h2>Settled Report</h2><br />
    @using (Html.BeginForm("Report", "ReportController", FormMethod.Get))
    {
        <p>
            Accounts: @Html.DropDownList("accountNumber")
            Start Date: @Html.TextBox("dt1", null, new { @class = "date-picker" })
            End Date: @Html.TextBox("dt2", null, new { @class = "date-picker" })
            @*@Html.Hidden("reportType", 1)*@
            <input type="hidden" id="" value="1" name="reportType" />
            <input type="submit" value="View Report" />
        </p>
        <div class="exportbuttons">
            @Html.ActionLink("Export to CSV", "GenerateCSV")
        </div>
    }

Вызывается GenerateCSV, но все параметры равны нулю, и сервер пытается перейти к Report/GenerateCSV

2 ответа

Решение

Ваш ActionLink это просто ссылка. Это не будет ссылаться на GenerateCSV действие с параметрами, которые вы хотите, потому что это просто ссылка без передаваемых параметров.

ОБНОВЛЕНИЕ Я не уверен, какова цель вашей страницы:

Предполагается ли, что у пользователя есть две кнопки: одна для просмотра отчета, другая для экспорта? Если это так, обратитесь к варианту 2 ниже.

Намерение, что у пользователя есть одна кнопка, и все, что он делает, это экспорт в CSV? Если это так, обратитесь к Варианту 1 ниже.

Вариант 1 - только одна кнопка на странице

Измените свою бритву следующим образом:

    @using (Html.BeginForm("GenerateCSV", "Report", FormMethod.Get))
    {
        <p>
            Accounts: @Html.DropDownList("accountNumber")
            Start Date: @Html.TextBox("dt1", null, new { @class = "date-picker" })
            End Date: @Html.TextBox("dt2", null, new { @class = "date-picker" })
            @*@Html.Hidden("reportType", 1)*@
            <input type="hidden" id="" value="1" name="reportType" />
            <input name="reportType" type="submit" value="Export to CSV" />
        </p>
    }

Вариант 2 - две кнопки на странице

Если вы хотите позволить пользователю либо нажать View Report кнопку, чтобы просмотреть его в браузере или Export to CSV чтобы отчет был экспортирован вместо показа пользователю, я бы предложил:

Измени свой Report() метод, так что он принимает строковый параметр с именем reportType и проверьте значение, чтобы определить, показывать ли его в браузере или вызывать GenerateCSV()

public ActionResult Report(string accountNumber, string dt1, string dt2, string reportType)
{
   if (reportType == "View Report")
   {
      // code to show report to user in browser
   }
   else 
   {
      return GenerateCSV(accountNumber, dt1, dt2);
   }
}

Измените свою бритву следующим образом:

    @using (Html.BeginForm("Report", "ReportController", FormMethod.Get))
    {
        <p>
            Accounts: @Html.DropDownList("accountNumber")
            Start Date: @Html.TextBox("dt1", null, new { @class = "date-picker" })
            End Date: @Html.TextBox("dt2", null, new { @class = "date-picker" })
            @*@Html.Hidden("reportType", 1)*@
            <input type="hidden" id="" value="1" name="reportType" />
            <input name="reportType" type="submit" value="View Report" />
            <input name="reportType" type="submit" value="Export to CSV" />
        </p>
    }

Ваша модель должна быть похожа

public class CSVDetails
{
    public List<long> AccountNumber {get; set;}
    public DateTime dt1 {get; set;}
    public DateTime dt2 {get; set;}
}

Тогда ваш взгляд должен быть

@model YourProjectNamespace.Models.CSVDetails
<h2>Settled Report</h2><br />
@using (Html.BeginForm("Report", "ReportController", FormMethod.Get))
{
    <p>
        Accounts: @Html.DropDownListFor(a=>a.AccountNumber)
        Start Date: @Html.TextBoxFor(a=>a.dt1, new { @class = "date-picker" })
        End Date: @Html.TextBoxFor(a=>a.dt2, new { @class = "date-picker" })

        <input type="hidden" id="" value="1" name="reportType" />
        <input type="submit" value="View Report" />
    </p>
    <div class="exportbuttons">
        @Html.ActionLink("Export to CSV", "GenerateCSV")
    </div>

В контроллере

public ActionResult GenerateCSV(CSVDetais csv)
{
      // your logic here
}

Надеюсь, это поможет вам!

Другие вопросы по тегам