【发布时间】:2019-12-19 22:47:34
【问题描述】:
我有一个 ASP.NET MVC 应用程序,其中有一个带有 jquery datePicker 和 HTML.ActionLink 的文本框,它将下载一个 Excel 文档,该文档使用从 datePicker 中选择的日期字符串。我希望 Excel 下载链接将此日期字符串用作其查询字符串中的参数。
在示例代码中,我将为我的类和变量提供示例名称。
这是我的主视图的摘录(视图名为“TestView”,模型属于“TestModel”类):
@using (Ajax.BeginForm("TestForm", FormMethod.Post,
new AjaxOptions
{
UpdateTargetId = "IdSomething",
OnFailure = "handleFailure(xhr, status, 'IdSomething')"
}))
{
@Html.AntiForgeryToken()
@Html.Action("TestSettings", Model)
<div class="clear margin-bottom-adjusted">
@Html.ActionLink(Markup.Download_As_Microsoft_Excel, "Download",
new { InstantlyUpdatedDate = Model.InstantlyUpdatedDate },
new { @class = "download-excel" });
</div>
}
这是“TestSettings”视图的相关摘录(它也使用“TestModel”类的模型)。此处的提交按钮和变量“NotInstantlyUpdatedDate”用于更新图表,但这与 Excel 下载无关:
<div>
@Html.TextBoxFor(m => m.NotInstantlyUpdatedDate, new { @class =
"datepicker", @onchange = "setExcelDownloadDate(" + @Json.Encode(Model) +
", $(this))" })
<input type="submit" value="@Markup.Update" class="btn" />
</div>
“setExcelDownloadDate”函数在javascript中定义如下:
function setExcelDOwnloadDate(model, item) {
if (item.attr('name') === "NotInstantlyUpdatedDate")
model.InstantlyUpdatedDate = item.val();
$.ajax({
url: '../Test/UpdateTestView',
type: 'post',
data: {
model: model
}
});
}
来自我的控制器的相关摘录:
public TestController
{
//Should only get called once by another view
[HttpPost]
public ActionResult InitTestView(TestModel model)
{
model.NotInstantlyUpdatedDate = "2018, 01, 01";
model.InstantlyUpdatedDate = model.NotInstantlyUpdatedDate;
return PartialView("TestView", model);
}
[HttpPost]
public ActionResult UpdateTestView(TestModel model)
{
return PartialView("TestView", model);
}
[HttpPost]
public Task<ActionResult> Download(DownloadModel model)
{
//download the model here
}
}
这是我在这个例子中的“TestModel”类:
[Serializable]
public class TestModel
{
public string NotInstantlyUpdatedDate { get; set; }
public string InstantlyUpdatedDate { get; set; }
}
这是我的 DownloadModel 类:
public class DownloadModel
{
public string InstantlyUpdatedDate { get; set; }
}
好的,谢谢你对我的包容。这是正在发生的事情:
首先调用 InitTestView 方法,并渲染一个 TestView。如果我在 TestView 的 @Html.ActionLink 行放置一个断点,它会告诉我 model.InstantlyUpdatedDate 变量是“2018, 01, 01”(这是正确的,也是预期的行为)。
由于 TestSettings 视图嵌入在 TestView 中,它将为我的日期选择器呈现 Html.TextBoxFor。如果我现在检查浏览器中的“下载”按钮,将显示正确的下载查询字符串,其中日期“2018,01,01”作为参数。
现在,假设我从 datepicker 中选择日期(“2018,01,02”)(转换为日期字符串是在 jquery 中完成的,不用担心,因为它按预期工作)。该日期现在将显示在文本框中,@onchange 事件将触发我的 JavaScript 函数 setExcelDownloadDate。在这个方法中,我可以放断点,看到我的model.InstantlyUpdatedDate确实已经设置为“2018,01,02”了。这是正确的行为。
ajax 调用从 javascript 函数将模型对象发送到我的 TestController。如果我中断了 UpdateTestView 函数,我可以查看我的模型变量,并在此处看到该值已更改为“2018,01,02”。工作正常。
现在这个方法返回一个带有更新模型的 TestView 的新实例,我仍然可以在 Html.ActionLink 行中断并看到确实如此,Model.InstantlyUpdatedDate 是“2018,01,02”,即正确。
然而,问题来了。如果我在浏览器中检查链接,我会发现该 url 不正确。日期不是“2018,01,02”,而是“2018,01,01”。如果我单击链接并在我的 Download 方法中设置断点,模型的 InstantlyUpdatedDate 属性也将是“2018,01,01”而不是“2018,01,02”。
由于某种原因,模型属性 InstantlyUpdatedDate 似乎变回了它的原始值。我不知道为什么会发生这种情况,因此我问你们中的一些人是否可以帮助我。这是一个更大的代码库的一部分,我不知道的事情当然可能会与正在发生的事情发生冲突。也可能是出于某种原因这是预期的行为,而我对它的工作原理还不够熟悉。
感谢您的宝贵时间。
【问题讨论】:
标签: javascript c# jquery asp.net-mvc html.actionlink