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)
这是一个错误吗?或者我做错了吗?
小智 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(..)返回多个元素,然后如果第一个是未选中的复选框,则返回第二个元素的值.
编辑
编辑2
我被告知这个问题现在已经解决了
| 归档时间: |
|
| 查看次数: |
1157 次 |
| 最近记录: |