需要一个很好的方法来改变条件值。 (ASP.NET MVC)
今天我的任务是一直在思考一段时间的问题。 我在页面上有一个表单,当从下拉列表中选择一个项目时,会有一个数据库调用,它获取信息并根据检索到的数据设置一个Required Date字段。 这工作正常,但我将下拉设置为knockout的change
事件活页夹,当重新访问页面进行更新时, 此事件在用户与页面交互之前运行两次 ,从而将Required Date设置为数据库调用最初获取的任何内容。 这里的问题是最终用户可以设置与估计日期不同的日期,我需要此调用不覆盖现有日期, 除非用户实际与下拉列表进行交互 。
我会尝试修剪这个来节省一些麻烦……
下拉菜单:
@Html.SearchPickerFor(m => m.ItemNumber, "ItemPicker", new { @class = "form-control" }.AddMore("data-bind", "value: $data.ItemNumber, event: { change: ItemNumericDetails($data) }" ))
在更改时转到ItemNumericDetails函数:
基本上是重定向到另外两个函数。
var ItemNumericDetails = function (lineData) { GetItemInfo(lineData); GetPriceUpdateTolerance(lineData); }
这两个函数是非常相似的AJAX调用,我们关注的是GetItemInfo
。 lineData是我模型中的一行(一对多模型关系中的一个孩子),来自淘汰赛的$data
function。
var GetItemInfo = function (lineData) { var orgId = lineData.ShipToOrgID(); var orgType = lineData.ShipToOrgType(); var itemNo = lineData.ItemNumber(); if ((orgId !== undefined && orgId !== "" && orgId !== null) && (orgType !== undefined && orgType !== "" && orgType !== null) && (itemNo !== undefined && itemNo !== "" && itemNo !== null)) { var model = { orgId: orgId, orgType: orgType, itemNumber: itemNo, destTPID: koModel.ModelData.DestTPID() }; var model = ko.mapping.toJS(model); $.ajax({ url: '@Url.Action("ItemInfo")', method: 'GET', headers: addAntiForgeryHeader(), datatype: 'json', contentType: "application/json; charset=utf-8", traditional: true, data: model }).done(function (data) { //... //model value assignment //... // VVV DATE CHANGING CODE HERE var date = new Date(); lineData.CalculatedDate(date.addDays(lineData.LeadTime())); lineData.RequiredDate(lineData.CalculatedDate()); // ^ ^ ^ }).fail(function () { console.log("An error occurred while getting order quantities data."); }); } }
我试过的:
我现在的工作方法是设置一个全局级迭代器,称为OQIterations
,从零开始,每次运行调用时计数,在运行两次之后,日期允许更改。 这是看起来像:
var OQIterations = 0; var GetItemInfo = function (lineData) { if (lineData.OQIterations === undefined) { lineData.OQIterations = OQIterations; // Assigns each line it's own iteration counter if it does not have one. } var orgId = lineData.ShipToOrgID(); var orgType = lineData.ShipToOrgType(); var itemNo = lineData.ItemNumber(); if (...) { var model = { ... }; var model = ko.mapping.toJS(model); $.ajax({ ... }).done(function (data) { ... // VVV Checks if the call has been made twice and if it has the next call will be able to modify the date if (lineData.OQIterations >= 2) { var date = new Date(); lineData.CalculatedDate(date.addDays(lineData.LeadTime())); lineData.RequiredDate(lineData.CalculatedDate()); } lineData.OQIterations++; }).fail(function () { console.log("An error occurred while getting order quantities data."); }); } }
这可行,但它似乎是一个非常hacky方式来做,我也不能保证该function将始终在页面加载之前运行两次所以我不认为这只是一个临时修复。
我可以使用什么代替此方法来保持自动日期分配,并防止更改发生,直到用户实际与下拉列表进行交互为止?
任何帮助是极大的赞赏。