如何使用knockout自定义绑定获取jquery验证状态?

时间:2013-10-26 10:42:35

标签: asp.net-mvc mvvm knockout.js jquery-validate

我尝试创建没有视图信息的视图模型,例如在保存/发送数据到服务器之前直接从视图模型调用jquery验证。

var vm = function () {
    var self = this;

    self.password = ko.observable();
    self.save = function (form) {
       // I want to prevent any view information call directly from view model.
       if ($(form).isValid()) {
          // $.ajax({});
       }
    };
};
ko.applyBindings(new vm());

@using (Html.BeginForm(null, null, FormMethod.Post, new { data_bind = "submit: save" }))

此外,我不想在视图模型中手动重新创建淘汰验证,因为它们已由asp.mvc数据注释生成为jquery验证属性。

[Required]
[StringLength(100, ErrorMessageResourceName = "ErrorMinStringLength", ErrorMessageResourceType = typeof(Locale), MinimumLength = 6)]
[DataType(DataType.Password)]
public string Password { get; set; }

@Html.PasswordFor(m => m.Password, new { data_bind = "value: Password" })

// Generated html in the browser view source.
<input type="password" name="Password" id="Password" data-val-required="The Password field is required." data-val-length-min="6" data-val-length-max="100" data-val-length="The Password must be at least 6 characters long." data-val="true" data-bind="value: Password">

我创建了一个简单的自定义绑定,它将更新有效状态,如下所示。

ko.bindingHandlers.jQueryIsValid = {
    init: function (element, valueAccessor) {
        $(element).closest("form").change(function () {
            var observable = valueAccessor();
            var isValid = $(element).valid();
            observable(isValid);
        });
    }
};

然后更新html并查看模型如下。

@using (Html.BeginForm(null, null, FormMethod.Post, new { data_bind = "submit: save, jQueryIsValid: isValid" }))

var vm = function () {
    var self = this;

    self.password = ko.observable();
    self.isValid = ko.observable();
    self.save = function () {
       if (self.isValid()) {
          // $.ajax({});
       }
    };
};
ko.applyBindings(new vm());

我的观点是强制执行mvvm模式,因为viewmodel理想情况下应该不了解视图(如$(form).dosomething)。我不确定上面的解决方案是最好的方法。我可能会想念自定义绑定或现有的淘汰赛功能,因为我是淘汰赛的新手。

有人能说出正确/最好的方法吗?

1 个答案:

答案 0 :(得分:1)

不需要自定义绑定。视图模型不需要知道表单的有效性。关键是save只能在有效表单上调用。此外,由于您打算使用AJAX调用替换提交行为,因此您需要确保在单击提交按钮时,表单回发。

您可以按照以下方式实现此目的......

$('form').submit(function(e){
    if ($(this).valid()) {
        viewModel.save();
        e.preventDefault();
    }
});