asp.net-mvc - 如何使用 knockout 自定义绑定(bind)获取 jquery 验证状态?

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

我尝试创建没有 View 信息的 View 模型,例如在将数据保存/发送到服务器之前直接从 View 模型调用 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" }))

另外我不想在 View 模型中手动重新创建 knockout validation ,因为它们是由 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">

我创建了一个简单的自定义绑定(bind),它将按如下方式更新有效状态。
ko.bindingHandlers.jQueryIsValid = {
    init: function (element, valueAccessor) {
        $(element).closest("form").change(function () {
            var observable = valueAccessor();
            var isValid = $(element).valid();
            observable(isValid);
        });
    }
};

然后按如下方式更新 html 和 View 模型。
@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 理想情况下应该不了解 View (如 $(form).dosomething)。我只是不确定上述解决方案是最好的方法。我可能会错过一些关于自定义绑定(bind)或现有 knockout 功能的信息,因为我是 knockout 新手。

有人可以展示正确/最佳的方法吗?

最佳答案

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

您可以按如下方式实现...

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

关于asp.net-mvc - 如何使用 knockout 自定义绑定(bind)获取 jquery 验证状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19605717/

相关文章:

javascript - MST 区域中的日期时间

asp.net-mvc - @Model和@ ViewData.Model有什么区别?

asp.net-mvc - 使用signalr时,IIS会有连接限制吗

.net - 如何创建 bool 编辑器模板? (.EditorFor<>)

knockout.js - Knockoutjs 将模型绑定(bind)到使用 ko.renderTemplate 创建的模板

wpf - 按钮单击和命令优先级

c# - 为什么更改 DataGrid ComboBox 值根本不会更新绑定(bind)属性?

wpf - 带导航的ICommand

knockout.js - KnockoutJS - 在应用绑定(bind)后更新可观察值

jQuery Validator.showErrors MVC ViewModel ModelState