需要一个很好的方法来改变条件值。 (ASP.NET MVC)

时间:2015-07-07 17:01:48

标签: javascript jquery asp.net-mvc knockout.js

今天我的任务是一直在思考一段时间的问题。我在页面上有一个表单,当从下拉列表中选择一个项目时,会有一个数据库调用,它获取信息并根据检索到的数据设置一个Required Date字段。这很好用,但我将下拉菜单设置为淘汰赛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功能。

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
             //...

             // V V V 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的全局级迭代器,它从0开始并在每次运行调用时计数,并且在它运行两次日期之后然后允许进行更改。这是看起来像:

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) {
             ...
             // V V V 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方式,我也无法保证该功能在页面加载之前总是运行两次所以我不认为这是任何事情但是暂时修复。

我可以使用哪种方法代替此方法来保持自动日期分配并阻止更改发生,直到用户实际与下拉列表进行交互为止?

非常感谢任何帮助。

0 个答案:

没有答案