【问题标题】:Knockout and jQuery Validation Remote: not getting latest valueKnockout 和 jQuery Validation Remote:没有获得最新值
【发布时间】:2017-02-15 18:53:13
【问题描述】:

我有一个淘汰视图模型,并且正在为它连接 jQuery 验证。其中一个值code,我想要远程检查以确保它尚未被使用。问题是在我的远程验证方法中,self.code() 调用返回的是旧值而不是新值。

我的验证代码(请注意,我还尝试了一种“更直接”的方法来获取值,但无济于事 - 结果相同):

form.validate({
    rules: {
        'plandetail-code': {
            required: true,
            remote: {
                url: '/Plans/ValidatePlanCode',
                type: 'POST',
                data: {
                    id: self.id(),
                    code: self.code() //form.find('[name="plandetail-code"]').val()
                }
            }
        },
        'plandetail-name': "required"                    
    }
});

相关的HTML:

<div class="form-group">
    <label for="plandetail-code">Code</label>
    <input type="text" name="plandetail-code" data-bind="textInput: code" class="form-control" />
</div>

我的控制器操作很简单,但请注意 code 始终作为原始值出现:

[HttpPost]
public string ValidatePlanCode(int? id, string code) {
    return _service.ValidatePlanCode(id, code) ? "true" : "false";
}

这是我的视图模型:我在应用绑定之前运行form.Validate({})(也尝试将其放在之后),并在saveChanges 方法中检查form.valid()

function PlanDetailVM(model) {

    var self = this;

    self.originalModel = model;
    self.form = $('#pgPlan-plan-detail-form');

    self.id = ko.observable(model.ID);
    self.active = ko.observable(model.Active);
    self.code = ko.observable(model.Code);
    self.name = ko.observable(model.Name);
    self.notes = ko.observable(model.notes);

    self.dirty = ko.computed(function () { return isDirty(); });

    self.save = function () { saveChanges(); }
    self.cancel = function () { cancelChanges(); }

    ko.applyBindings(self, document.getElementById('pgPlan-detail-container'));
    initValidation(self.form);

    return self;


    function initValidation(form) {

        form.validate({
            rules: {
                'plandetail-code': {
                    required: true,
                    remote: {
                        url: '/Plans/ValidatePlanCode',
                        type: 'POST',
                        data: {
                            id: self.id(),
                            code: self.code() //form.find('[name="plandetail-code"]').text()
                        }
                    }
                },
                'plandetail-name': "required"                    
            }
        });

    }

    function isDirty() { ... }

    function saveChanges() {

        if (!self.form.valid()) {
            return;
        }

        // ajax snipped
    }

    function cancelChanges() { ... }

}

复制:

  • 加载初始视图,代码值为 AAAA
  • 将代码更改为 BBBB
  • 观察调用的控制器动作
  • 控制器操作代码参数 = AAAA

我不确定为什么无法从文本输入中获取最新值。我错过了什么吗?谢谢

【问题讨论】:

    标签: javascript jquery knockout.js jquery-validate


    【解决方案1】:

    rules 是一个object,它会立即被求值,所以如果你使用self.id()data 对象将使用默认值创建(因为它返回值而不是函数)

    所以你需要将它用作函数

    form.validate({
      rules: {
        'plandetail-code': {
          required: true,
          remote: {
            url: '/Plans/ValidatePlanCode',
            type: 'POST',
            data: {
              id: self.id, // function evaluated at runtime
              code: self.code
            }
          }
        },
        'plandetail-name': "required"
      }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-24
      • 1970-01-01
      • 2016-01-30
      • 1970-01-01
      • 1970-01-01
      • 2016-11-24
      • 1970-01-01
      相关资源
      最近更新 更多