需要一个好方法条件值变化。 (ASP.NET MVC)(Need a good approach

2019-10-23 16:54发布

今天我任务是,我一直在琢磨了一段时间的问题。 我有一个页面,当从下拉列表中选择一个项目,有一个数据库调用,获取信息,并设置根据检索到的数据所需的日期字段上的表单。 这工作得很好,但我有下拉菜单设置为淘汰赛的change事件绑定,并重温页面的更新时, 用户之前与页面交互 ,从而设置所需日期到任何数据库调用最初得到这个事件运行两次 。 这里的问题是,最终用户可以设置不同的日期比预产期,我需要这个调用,除非用户实际使用下拉相互作用 ,不覆盖现有的日期。

我会试着修剪这个以节省一些头痛...

下拉:

@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是在我的模型一行(在1对多模式关系的孩子),从淘汰赛的到来$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是从零开始,每个呼叫运行时间计数,它已经运行了两次后日期更改随后允许进行。 这是什么样子:

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.");
         });
     }
 }

这工作,但它似乎是一个真正哈克的方式做到这一点,我也不能保证该函数将始终运行前两次在页面加载,所以我不认为这是什么,但一个临时的解决办法做。

什么可能我用这个方法,而不是保持自动日期分配到位,并防止发生的种种变化,直到用户实际使用下拉交互?

任何帮助是极大的赞赏。

文章来源: Need a good approach to conditional value changing. (ASP.NET MVC)