【问题标题】:Why is my routeValues variable changing between my view loading and me clicking on my Html.ActionLink in ASP.NET MVC?为什么我的 routeValues 变量在我的视图加载和我单击 ASP.NET MVC 中的 Html.ActionLink 之间发生变化?
【发布时间】: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


    【解决方案1】:

    我在执行此操作时遇到了一些麻烦,但我会尝试一下。似乎您没有对 $.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());
    

    【讨论】:

    • 谢谢。我实施了你的最后一个建议,效果很好。接受了你的回答。不过,我不明白的是,为什么(在您的第一个建议中),必须将 html 附加到 javascript 中的页面。为什么重新实例化 PartialView 时 ActionLink 中的 URL 不刷新...?
    • @Philzax 事情是 PartialView 没有重新实例化。您获得了局部视图的 html,但您没有使用新的 html 代码更新浏览器。您缺少最后一步。
    猜你喜欢
    • 2014-06-12
    • 2016-01-27
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多