Asp.net mvc 如何使用敲除自定义绑定获得jquery验证状态?

Asp.net mvc 如何使用敲除自定义绑定获得jquery验证状态?,asp.net-mvc,mvvm,knockout.js,jquery-validate,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.

我尝试创建没有视图信息的视图模型,比如在将数据保存/发送到服务器之前直接从视图模型调用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">
然后更新html和视图模型,如下所示

ko.bindingHandlers.jQueryIsValid = {
    init: function (element, valueAccessor) {
        $(element).closest("form").change(function () {
            var observable = valueAccessor();
            var isValid = $(element).valid();
            observable(isValid);
        });
    }
};
@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)。我只是不确定上述解决方案是否是最好的方法。我可能会错过一些关于自定义绑定或现有淘汰功能的内容,因为我是新加入淘汰的


有人能告诉我正确/最好的方法吗?

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

您可以通过以下方式实现此目标

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

这可能与我的原始代码相同,我使用来自淘汰数据的submit事件绑定,而您使用来自jquery的submit事件。处理
submit
的任何一种方法都同样有效。我要说的是,有效性检查超出了
save
函数的范围,您必须调用
e.preventDefault()
,否则浏览器会发布表单,您将无法观察到您的异步行为。我使用knockout在js上实现mvvm模式,并基于,“使用KO时,视图模型是纯JavaScript对象,不包含HTML知识”,我的原始代码的问题是我必须有这样一个“if($(form).isValid())“保存前要验证的代码。然后我尝试创建自己的绑定处理程序,但我不确定KO中是否已经有这样的功能,而且每次表单更改时它都会触发表单验证。我希望有类似ko.IsValid()的东西,如果有的话。不,没有类似的东西。我在这里给出的示例严格执行MVVM。提交处理程序包含有关
的知识,允许我们测试
$(this).valid()
并调用
e.preventDefault()
。这意味着您的视图模型不需要DOM知识。