Asp.net mvc 带有附加布尔字段的MVC远程验证

Asp.net mvc 带有附加布尔字段的MVC远程验证,asp.net-mvc,asp.net-mvc-5,unobtrusive-validation,asp.net-mvc-5.2,Asp.net Mvc,Asp.net Mvc 5,Unobtrusive Validation,Asp.net Mvc 5.2,我正在尝试将远程验证与其他bool复选框字段一起使用 [Remote("IsStorageConnectionValid", "TenantManagement", AdditionalFields = "CreateStorage")] public String StorageConnectionString { get; set; } 验证码 public JsonResult IsStorageConnectionValid(string storageConnectionString

我正在尝试将远程验证与其他bool复选框字段一起使用

[Remote("IsStorageConnectionValid", "TenantManagement", AdditionalFields = "CreateStorage")]
public String StorageConnectionString { get; set; }
验证码

public JsonResult IsStorageConnectionValid(string storageConnectionString, bool createStorage){
它在命中验证器方面工作得非常完美。但是,无论复选框的值如何,createStorage始终为true。如果我使用了不是复选框的其他字段,那么这些字段将被完美地提供

复选框创建为标准:

  @Html.CheckBoxFor(m => m.CreateStorage)
这是虫子吗?还是我做错了


当与@Html.CheckBoxFor一起使用时,这似乎是一个bug。问题是,CheckBoxFor呈现2个元素,一个值为true的复选框和一个值为false的隐藏输入未选中复选框不会回发,因此第二个隐藏输入确保回发一个值供DefaultModelBinder使用

查看jquery.validate.unobtrusive.js文件的相关部分

return语句返回您的case.find':input[name=CreateStorage]'.val;返回第一个输入的值,其名称为=CreateStorage,该值将始终为true复选框的值

作为测试,如果使用HiddenFor而不是CheckBoxFor呈现值,您将在IsStorage ConnectionValid方法中收到正确的值,但这当然会有所帮助,因为您无法更改该值

不确定最佳解决方案,但不引人注目的脚本应该首先检查if.find。。返回多个元素,如果第一个元素是未选中的复选框,则返回第二个元素的值

编辑

我已将此报告为

编辑2


我已被告知,该问题现在已被解决。

当与@Html.CheckBoxFor一起使用时,这似乎是一个bug。问题是,CheckBoxFor呈现2个元素,一个值为true的复选框和一个值为false的隐藏输入未选中复选框不会回发,因此第二个隐藏输入确保回发一个值供DefaultModelBinder使用

查看jquery.validate.unobtrusive.js文件的相关部分

return语句返回您的case.find':input[name=CreateStorage]'.val;返回第一个输入的值,其名称为=CreateStorage,该值将始终为true复选框的值

作为测试,如果使用HiddenFor而不是CheckBoxFor呈现值,您将在IsStorage ConnectionValid方法中收到正确的值,但这当然会有所帮助,因为您无法更改该值

不确定最佳解决方案,但不引人注目的脚本应该首先检查if.find。。返回多个元素,如果第一个元素是未选中的复选框,则返回第二个元素的值

编辑

我已将此报告为

编辑2


有人告诉我,这个问题现在已经解决了

,这可能有助于我们像浏览器看到的那样看到代码。换句话说,请发布一个呈现HTML标记和JavaScript的简明示例。它做同样的事情,这可能有助于我们看到浏览器看到的代码。换句话说,请发布一个呈现HTML标记和JavaScript的简明示例。它做同样的事情
adapters.add("remote", ["url", "type", "additionalfields"], function (options) {
  var value = {
    url: options.params.url,
    type: options.params.type || "GET",
    data: {}
  },
  prefix = getModelPrefix(options.element.name);

  $.each(splitAndTrim(options.params.additionalfields || options.element.name), function (i, fieldName) {
    var paramName = appendModelPrefix(fieldName, prefix);
    value.data[paramName] = function () {
      return $(options.form).find(":input[name='" + escapeAttributeValue(paramName) + "']").val();
    };
  });

  setValidationValues(options, "remote", value);
});