当用户点击Html.ActionLink
时,我需要调用一个控制器方法,该方法将为用户下载csv
报告。我还需要从两个输入框传递此控制器的值,这两个输入框将表示他们正在寻找的开始和结束日期范围。
目前我可以使用jQuery分配Html.ActionLink
参数,但是它们并没有将它返回给控制器。控制器方法中的两个参数都使用null
值进行实例化。
我也不能使用表单/提交方法,因为它已经在此特定表单上使用,以允许用户在导出到csv之前查看请求的日期范围内的数据。
的jQuery
$(document).ready(function() {
$('#startDate').change(function () {
$('a').attr('start', $(this).val());
});
$('#endDate').change(function () {
$('a').attr('end', $(this).val());
});
});
ASP MVC 3查看
@using (Html.BeginForm())
{
<div id="searchBox">
@Html.TextBox("startDate", ViewBag.StartDate as string, new { placeholder = " Start Date" })
@Html.TextBox("endDate", ViewBag.EndDate as string, new { placeholder = " End Date" })
<input type="image" src="@Url.Content("~/Content/Images/Search.bmp")" alt="Search" id="seachImage"/>
<a href="#" style="padding-left: 30px;"></a>
</div>
<br />
@Html.ActionLink("Export to Spreadsheet", "ExportToCsv", new { start = "" , end = ""} )
<span class="error">
@ViewBag.ErrorMessage
</span>
}
控制器方法
public void ExportToCsv(string start, string end)
{
var grid = new System.Web.UI.WebControls.GridView();
var banks = (from b in db.AgentTransmission
where b.RecordStatus.Equals("C") &&
b.WelcomeLetter
select b)
.AsEnumerable()
.Select(x => new
{
LastName = x.LastName,
FirstName = x.FirstName,
MiddleInitial = x.MiddleInitial,
EffectiveDate = x.EffectiveDate,
Status = x.displayStatus,
Email = x.Email,
Address1 = x.LocationStreet1,
Address2 = x.LocationStreet2,
City = x.LocationCity,
State = x.LocationState,
Zip = "'" + x.LocationZip,
CreatedOn = x.CreatedDate
});
grid.DataSource = banks.ToList();
grid.DataBind();
string style = @"<style> .textmode { mso-number-format:\@; } </style> ";
Response.ClearContent();
Response.AddHeader("content-disposition", "attachment; filename=WelcomeLetterOutput.xls");
Response.ContentType = "application/excel";
StringWriter sw = new StringWriter();
HtmlTextWriter htw = new HtmlTextWriter(sw);
grid.RenderControl(htw);
Response.Write(style);
Response.Write(sw.ToString());
Response.End();
}
答案 0 :(得分:3)
我认为问题在于链接没有'start'或'end'属性。所以$('a').attr('start', $(this).val());
将不会做任何事情。
<a href="#" id="lnkExport">Export to Spreadsheet</a>
$('#lnkExport').click(function (e){
e.preventDefault();
window.location = '/Home/ExportToCsv?start=' + $('#startDate').val() + '&end=' + $('#endDate').val();
});
答案 1 :(得分:1)
我也不能使用表单/提交方法,因为它已被使用 在此特定表单上,允许用户查看日期中的数据 导出到csv之前请求的范围。
实际上你可以在你的表单中有2个提交按钮,并且在你的POST控制器动作中知道点击了哪个按钮以便采取相应的行动。就像那样:
<button type="submit" name="btn" value="search">Search</button>
<button type="submit" name="btn" value="export">Export to Spreadsheet</button>
现在你的控制器动作可以采用btn
参数:
[HttpPost]
public ActionResult SomeAction(MyViewModel model, string btn)
{
if (btn == "search")
{
// The search button was clicked, so do whatever you were doing
// in your Search controller action
}
else if (btn == "export")
{
// The "Export to Spreadsheet" button was clicked so do whatever you were
// doing in the controller action bound to your ActionLink previously
}
...
}
正如您在两种情况下所看到的那样,表单被提交到相同的控制器操作,您可以在其中显示表单数据中的视图模型,此外您还将知道单击了哪个按钮以采取适当的操作。所以现在你可以摆脱你可能写的所有花哨的javascript和锚点。即使用户禁用了javascript,您的应用程序也能正常运行。这是简单明了的HTML。
注意:请记住,您在问题中显示和调用控制器方法的内容不是ASP.NET MVC中的标准内容。在ASP.NET MVC中,这些方法具有名称。 Tjeir被称为控制器动作,必须返回ActionResults
而不是无效。另外,您似乎在ASP.NET MVC应用程序中严肃对待var grid = new System.Web.UI.WebControls.GridView();
?