繁体   English   中英

jQuery AJAX .load()仅命中一次控制器方法

[英]jQuery AJAX .load() only hitting controller method once

因此,我已经阅读了其他一些类似的问题,但找不到与我的情况完全相符的问题。 我的脚本标签如下:

 $(document).ready(function() { $(document).on("change", '[id*="SomeId]', function() { SomeFunction(); }); }); function SomeFunction() { $("SomeOtherId").load('@(Url.Action("ControllerMethod", "Controller", null, Request.Url.Scheme))?numberExample=' + 7); }); 
 <div class="col-md-10 mrgn-tp-sm"> @Html.DropDownListFor(model => model.SomeProperty, (SelectList)Model.SomeOtherProperty, htmlAttributes: new { @id="SomeId", @class="form-control" }) </div> <div id="SomeOtherId" class="col-md-10 mrgn-tp-sm"> @Html.DropDownListFor(model => model.SomeEvenOtherProperty, (SelectList)Model.SomeEvenOtherOtherProperty, htmlAttributes: new { @class="form-control" }) </div> 

所以我的目标是,当用户从第一个下拉列表中选择其他选项时,第二个下拉列表将动态更改。 当调用.load()函数时,会发生这种情况。

这是正在发生的事情。 我在控制器中方法的开头放置了一个断点。 启动应用程序时,请转到此页面,然后从第一个下拉列表中选择一个选项。 调用SomeFunction()并运行SomeOtherId div上的.load(),导致命中断点。 该controller方法呈现一个局部视图,该视图包含另一个列表,例如@Html.DropDownListFor(model => model.SomeEvenOtherProperty, (SelectList)Model.SomeEvenOtherOtherProperty, htmlAttributes: new { @class = "form-control" })代替旧列表一。 现在,如果我从第一个下拉列表中选择了一个不同的选项,则再次会命中断点,第二个下拉列表将被更新。

当我返回选择第一个选项时,出现了问题,没有找到断点,但是列表仍在更新。 我需要每次都到达该断点,但是似乎它实际上只调用一次控制器方法。 我已经调试了Javascript,可以确认每次都调用SomeFunction() 我也尝试过放置带有警报的回调,以确认.load()函数已成功执行。 即使重新加载页面后,此问题仍然存在。 对于一个选项,我可以两次达到该断点的唯一方法是:

  1. 重新启动应用程序。
  2. 检查元素->控制台。

奇怪的是,当我检查页面上的元素时,对于特定的选项,它将多次击中断点。

额外详情:

因此,按照简单的说法,第二个下拉列表应该包含一组不同的选项,具体取决于在第一个列表中选择的选项。 但是,如果用户选择保存包含列表1中的选项2和列表2中的选项2的组合的新实体,则他们将无法保存具有相同组合的另一个实体。

因此,由于此问题一直存在,直到应用程序重新启动,它允许用户创建相同的TWICE组合,因为将使用旧列表代替第二个下拉列表。 控制器方法的目的是通过快速调用数据库以找出存在的组合来呈现过滤列表。 如果用户已将列表1中的选项2和列表2中的选项2保存到数据库,则当他们返回以创建另一个组合时,如果他们从列表1中选择选项2,则不应在列表2中显示选项2。仅在第一次创建组合时才调用controller方法,当他们决定为列表1中的选项2创建另一个组合时,它将呈现旧列表,并显示列表2中的选项2。

在第一个下拉菜单中添加“ onchange”,该下拉菜单将调用javascript函数并传递“ this.value”

@Html.DropDownListFor(m => m.ResultId, new SelectList(The list of objects, "fieldid", "value"), new { @class = "form-control HomePageDropDown", @onchange = "javascript:GetValues(this.value);" }) 

在您的javascript函数发布数据中,您要向控制器发送数据(可能是下拉列表的ID)。 在控制器函数中,获取下一个下拉列表所需的对象列表,并将其作为Json返回。

在ajax结果中,为下拉列表创建标记,然后将其传递给页面中的ID。

            var markup = "<option Value='0'>Select option</option>";

            for (var i = 0; i < result.length; i++)
            {
                markup += "<option Value=" + result[i].Value + ">" + result[i].Text + "</option>";
            }

            $("#YOUR ID").html(markup).show();


<select class="form-control HomePageDropDown" data-val="true" id="ID" name="NAME"></select>

在深入研究问题之后,我在这里找到了解决方案: 停止缓存jQuery .load响应

原来这毕竟是一个缓存问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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