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

时间:2014-10-10 22:17:31

标签: 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 createStorage){

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

标准创建复选框:

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

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

Fiddle Is here (Is MVC4 I think but does the same thing)

1 个答案:

答案 0 :(得分: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"第一个输入的值,该值始终为{{1} (复选框的值)

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

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

修改

我已将此报告为issue at Codeplex

修改2

我被告知问题现在已经fixed here