使用其他bool字段进行MVC远程验证

Gra*_*ler 1 asp.net-mvc unobtrusive-validation asp.net-mvc-5 asp.net-mvc-5.2

我正在尝试使用远程验证和其他bool复选框字段

[Remote("IsStorageConnectionValid", "TenantManagement", AdditionalFields = "CreateStorage")]
public String StorageConnectionString { get; set; }
Run Code Online (Sandbox Code Playgroud)

验证码

public JsonResult IsStorageConnectionValid(string storageConnectionString, bool createStorage){
Run Code Online (Sandbox Code Playgroud)

它在击中验证器方面非常有效.但是,无论复选框的值如何,createStorage始终为true.如果我使用不是复选框的其他字段,则可以完美地提供它们.

复选框作为标准创建:

  @Html.CheckBoxFor(m => m.CreateStorage)
Run Code Online (Sandbox Code Playgroud)

这是一个错误吗?或者我做错了吗?

小提琴在这里(MVC4我认为但做同样的事情)

小智 5

看来,这与使用时的错误相似@Html.CheckBoxFor.问题是CheckBoxFor呈现2个元素,带有复选框value="true"和隐藏输入value="false"(未选中复选框不回发,因此第二个隐藏输入确保将值回发以供使用DefaultModelBinder)

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

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);
});
Run Code Online (Sandbox Code Playgroud)

return语句返回(在你的情况下),.find(':input[name="CreateStorage"]').val();它返回的值,第一与输入name="CreateStorage",这将永远是true(复选框的值)

作为测试,如果您使用HiddenFor相反的方式渲染值,CheckBoxFor您将在IsStorageConnectionValid方法中收到正确的值(但当然这会有所帮助,因为您无法更改值)

不确定最佳解决方案,但unobtrusive脚本应首先检查是否.find(..)返回多个元素,然后如果第一个是未选中的复选框,则返回第二个元素的值.

编辑

在Codeplex报告了这个问题

编辑2

我被告知这个问题现在已经解决了