为什么我的 routeValues 变量在我的视图加载和我点击 ASP.NET MVC 中的 Html.ActionLink 之间发生变化?
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 的文本框,它将下载一个使用日期字符串的 Excel 文档从 datePicker 中挑选。我希望 link 到 Excel 下载将此日期字符串用作其查询字符串中的参数。
在示例代码中,我将为 classes 和变量提供示例名称。
这是我的主视图的摘录(视图名为 "TestView",模型为 class "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" 视图的相关摘录(它还使用了 class "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" class 这个例子:
[Serializable]
public class TestModel
{
public string NotInstantlyUpdatedDate { get; set; }
public string InstantlyUpdatedDate { get; set; }
}
这是我的下载模型 class:
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”作为参数。
现在,假设我从日期选择器中选择日期 ("2018, 01, 02")(转换为日期字符串是在 jquery 中完成的,不用担心,因为它正在工作正如预期的那样)。该日期现在将显示在文本框中,@onchange 事件将触发我的 javascript 函数 setExcelDownloadDate。在这个方法中,我可以打断点,看到我的model.InstantlyUpdatedDate确实已经设置为“2018,01,02”。这是正确的行为。
从 javascript 函数中,ajax 调用将模型对象发送到我的 TestController。如果我中断函数 UpdateTestView,我可以查看我的模型变量,还可以看到这里的值已更改为“2018、01、02”。工作正常。
现在这个方法 returns 我的 TestView 的一个新实例和更新的模型,我仍然可以在 Html.ActionLink 行中断并看到确实如此, Model.InstantlyUpdatedDate 是"2018, 01, 02",正确。
然而,问题来了。如果我在浏览器中检查 link,我会发现 url 不正确。日期不是“2018,01,02”,而是“2018,01,01”。如果我单击 link 并在我的下载方法中放置一个断点,模型的 InstantlyUpdatedDate 属性 也将是“2018, 01, 01”而不是“2018, 01, 02”。
出于某种原因,模型 属性 InstantlyUpdatedDate 似乎变回了它的原始值。我不知道为什么会这样,因此我想问问你们中的一些人是否可以帮助我。这是更大的代码库的一部分,我不知道的东西当然可能会影响正在发生的事情。也可能是由于某种原因这是预期的行为,我只是不太熟悉它应该如何工作。
感谢您的宝贵时间。
我在执行此操作时遇到了一些麻烦,但我会试一试。看起来你没有对 $.ajax 的结果做任何事情。它将 return 部分视图,所有内容都已填满,但什么也没做。
$.ajax({
url: '../Test/UpdateTestView',
type: 'post',
data: {
model: model
}
}).done(function( html ) {
// $( "#results" ).append( html ); // Put the html somewhere
});
就我个人而言,在 onchange 中,我只会更新 link 而不是整个局部视图。当有比 link.
更多的变化时,我通常会更新局部视图
$('#linkId').attr('href', '@Url.Action(Markup.Download_As_Microsoft_Excel, "Download")?InstantlyUpdatedDate=' + item.val());
我有一个 ASP.NET MVC 应用程序,其中有一个带有 jquery datePicker 和 HTML.ActionLink 的文本框,它将下载一个使用日期字符串的 Excel 文档从 datePicker 中挑选。我希望 link 到 Excel 下载将此日期字符串用作其查询字符串中的参数。
在示例代码中,我将为 classes 和变量提供示例名称。
这是我的主视图的摘录(视图名为 "TestView",模型为 class "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" 视图的相关摘录(它还使用了 class "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" class 这个例子:
[Serializable]
public class TestModel
{
public string NotInstantlyUpdatedDate { get; set; }
public string InstantlyUpdatedDate { get; set; }
}
这是我的下载模型 class:
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”作为参数。
现在,假设我从日期选择器中选择日期 ("2018, 01, 02")(转换为日期字符串是在 jquery 中完成的,不用担心,因为它正在工作正如预期的那样)。该日期现在将显示在文本框中,@onchange 事件将触发我的 javascript 函数 setExcelDownloadDate。在这个方法中,我可以打断点,看到我的model.InstantlyUpdatedDate确实已经设置为“2018,01,02”。这是正确的行为。
从 javascript 函数中,ajax 调用将模型对象发送到我的 TestController。如果我中断函数 UpdateTestView,我可以查看我的模型变量,还可以看到这里的值已更改为“2018、01、02”。工作正常。
现在这个方法 returns 我的 TestView 的一个新实例和更新的模型,我仍然可以在 Html.ActionLink 行中断并看到确实如此, Model.InstantlyUpdatedDate 是"2018, 01, 02",正确。
然而,问题来了。如果我在浏览器中检查 link,我会发现 url 不正确。日期不是“2018,01,02”,而是“2018,01,01”。如果我单击 link 并在我的下载方法中放置一个断点,模型的 InstantlyUpdatedDate 属性 也将是“2018, 01, 01”而不是“2018, 01, 02”。
出于某种原因,模型 属性 InstantlyUpdatedDate 似乎变回了它的原始值。我不知道为什么会这样,因此我想问问你们中的一些人是否可以帮助我。这是更大的代码库的一部分,我不知道的东西当然可能会影响正在发生的事情。也可能是由于某种原因这是预期的行为,我只是不太熟悉它应该如何工作。
感谢您的宝贵时间。
我在执行此操作时遇到了一些麻烦,但我会试一试。看起来你没有对 $.ajax 的结果做任何事情。它将 return 部分视图,所有内容都已填满,但什么也没做。
$.ajax({
url: '../Test/UpdateTestView',
type: 'post',
data: {
model: model
}
}).done(function( html ) {
// $( "#results" ).append( html ); // Put the html somewhere
});
就我个人而言,在 onchange 中,我只会更新 link 而不是整个局部视图。当有比 link.
更多的变化时,我通常会更新局部视图$('#linkId').attr('href', '@Url.Action(Markup.Download_As_Microsoft_Excel, "Download")?InstantlyUpdatedDate=' + item.val());