Javascript 敲除和jQuery验证远程:未获取最新值

Javascript 敲除和jQuery验证远程:未获取最新值,javascript,jquery,knockout.js,jquery-validate,Javascript,Jquery,Knockout.js,Jquery Validate,我有一个淘汰的viewModel,正在为它连接jQuery验证。其中一个值,code,我需要远程检查以确保它尚未使用。问题在于,在我的远程验证方法中,self.code()调用返回的是旧值而不是新值 我的验证代码(注意,我还尝试了一种“更直接”的方法来获取值,但没有效果-结果相同): 相关Html: <div class="form-group"> <label for="plandetail-code">Code</label> <in

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

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

相关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>
下面是我的viewmodel:我在应用绑定之前运行
表单。Validate({})
(也尝试将其放在后面),然后在
saveChanges
方法中检查
表单.valid()

复制:

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

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

规则
是一个立即求值的
对象,因此如果您使用
self.id()
(因为它返回值而不是函数),将使用默认值创建
数据
对象

因此,您需要将其用作函数

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"
  }
});
[HttpPost]
public string ValidatePlanCode(int? id, string code) {
    return _service.ValidatePlanCode(id, code) ? "true" : "false";
}
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() { ... }

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