[英]Why is my routeValues variable changing between my view loading and me clicking on my Html.ActionLink in ASP.NET MVC?
我有一个ASP.NET MVC应用程序,其中有一个带有jquery datePicker和HTML.ActionLink的文本框,该文本框将下载使用从datePicker选取的日期字符串的Excel文档。 我希望到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>
像这样在javascript中定义“ setExcelDownloadDate”函数:
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。 在这种方法中,我可以放置断点并查看我的模型。InstantlyUpdatedDate实际上已经设置为“ 2018,01,02”。 这是正确的行为。
通过javascript函数,ajax调用将模型对象发送到我的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似乎会变回其原始值。 我不知道为什么会这样,因此我问你们中有些人是否可以帮助我。 这是一个更大的代码库的一部分,我当然不知道这可能与发生的事情有关。 也可能是出于某种原因,这是预期的行为,而我对此的工作方式还不十分了解。
感谢您的时间。
我在执行此操作时遇到了一些麻烦,但我会尝试。 似乎您没有对$ .ajax的结果做任何事情。 它将返回已填充所有内容的部分视图,但不会执行任何操作。
$.ajax({
url: '../Test/UpdateTestView',
type: 'post',
data: {
model: model
}
}).done(function( html ) {
// $( "#results" ).append( html ); // Put the html somewhere
});
就个人而言,在onchange中,我将只更新链接而不是整个局部视图。 当变化多于链接时,我通常会更新部分视图。
$('#linkId').attr('href', '@Url.Action(Markup.Download_As_Microsoft_Excel, "Download")?InstantlyUpdatedDate=' + item.val());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.