繁体   English   中英

为什么在加载视图和单击ASP.NET MVC中的Html.ActionLink之间,我的routeValues变量会发生变化?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM