淘汰赛和 jQuery 远程验证:未获得最新值
Knockout and jQuery Validation Remote: not getting latest value
我有一个 knockout viewModel 并且正在连接 jQuery 对其进行验证。其中一个值 code
,我想要远程检查以确保它尚未被使用。问题是在我的远程验证方法中,self.code()
调用返回旧值而不是新值。
我的验证码(注意我也尝试了 "more direct" 获取值的方法,但无济于事 - 结果相同):
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
我不确定为什么无法从文本输入中获取最新值。我错过了什么吗?谢谢
rules
是立即计算的 object
,因此如果您使用 self.id()
,data
对象将使用默认值创建(因为它 returns 值不是函数)
所以你需要把它当作函数来使用
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"
}
});
我有一个 knockout viewModel 并且正在连接 jQuery 对其进行验证。其中一个值 code
,我想要远程检查以确保它尚未被使用。问题是在我的远程验证方法中,self.code()
调用返回旧值而不是新值。
我的验证码(注意我也尝试了 "more direct" 获取值的方法,但无济于事 - 结果相同):
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
我不确定为什么无法从文本输入中获取最新值。我错过了什么吗?谢谢
rules
是立即计算的 object
,因此如果您使用 self.id()
,data
对象将使用默认值创建(因为它 returns 值不是函数)
所以你需要把它当作函数来使用
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"
}
});