我想知道是否有人可以在这里提供建议。使用MVC ASP.NET。我有一个htmlhelper ddl
@Html.DropDownListFor(m => m.ddlStartTime, new SelectList(Model.StartTimes, "Text", "Value", ViewBag.selected), new { data_test = "true", @Class = "form-control", onchange = "SubmitDayViewer(this.id)" })
然后我有一个AJAX json请求,它获取并获取我的数据并返回部分视图以及其他一些json字符串数据。
function SubmitDayViewer(pId) {
var obj1 = { dateValue: $('#dteTester').val(), timeValue: $('#ddlStartTime').val(), callerID: pId };
$.ajax({
type: "POST",
url: '@Url.Action("_ADayRoomViewerPartial", "Common")',
data: obj1,
datatype: "json",
success: function (data) {
$("#ddlStartTime").select2("val", data.DDLTimeValue);
}
});
}
我无法克服的问题是,一旦我更改了所选值,就会阻止@ Html.DropDownListFor onChange事件触发。所以我最终陷入了无限循环。我需要设计一种只在用户更改实际ddl时触发事件的方法。手动不是当页面上的其他控件更新时,因此需要动态更改所选值而不触发事件。因此,在某些情况下,基本上不会发生变化。
答案 0 :(得分:1)
使用off
删除更改事件,然后使用on
重新添加: -
function SubmitDayViewer() {
var obj1 = { dateValue: $('#dteTester').val(), timeValue: $('#ddlStartTime').val(), callerID: this.id};
$.ajax({
type: "POST",
url: '@Url.Action("_ADayRoomViewerPartial", "Common")',
data: obj1,
datatype: "json",
success: function (data) {
$("#ddlStartTime").off('change', SubmitDayViewer);
$("#ddlStartTime").select2("val", data.DDLTimeValue);
$("#ddlStartTime").on('change', SubmitDayViewer);
}
});
}
另外,在函数中使用this
而不是传入它。
修改强>
如果仍然发生这种情况,则select2必须以某种方式延迟该设置。因此,您可以查看插件代码以查看最新情况,或者您可以添加超时以重新添加更改事件。
$("#ddlStartTime").off('change', SubmitDayViewer);
$("#ddlStartTime").select2("val", data.DDLTimeValue);
window.setTimeout(function(){
$("#ddlStartTime").on('change', SubmitDayViewer);
}, 2000); // 2 seconds
我个人会在插件中查找更清晰的解决方案。