1

我正在尝试使用带有额外布尔复选框字段的远程验证

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

验证码

public JsonResult IsStorageConnectionValid(string storageConnectionString, bool createStorage){

它在击中验证器方面非常有效。然而,无论复选框的值如何, createStorage 始终为真。如果我使用不是复选框的附加字段,它们会完美提供。

作为标准创建的复选框:

  @Html.CheckBoxFor(m => m.CreateStorage)

这是一个错误吗?还是我做错了?

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

4

1 回答 1

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);
});

return语句返回(在您的情况下).find(':input[name="CreateStorage"]').val();,它返回第一个输入的值,name="CreateStorage"其中始终是true(复选框的值)

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

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

编辑

我已在 Codeplex 将此问题报告为问题

编辑 2

我已被告知该问题现已在此处解决

于 2014-10-10T23:55:42.483 回答