我正在尝试使用远程验证和其他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)
这是一个错误吗?或者我做错了吗?
答案 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