Генерировать и загружать 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
}
Надеюсь, это поможет вам!