我有一个具有以下 2 个属性的 MVC5 ViewModel:
public class RegisterViewModel
{
[Required]
[EmailAddress]
[Display(Name = "Email")]
public string Email { get; set; }
[Display(Name = "DOB")]
public DateTime DateOfBirth { get; set; }
[Required]
[Display(Name = "Business Name")]
public string BusinessName { get; set; }
}
以及以下 View :
@using (Html.BeginForm("Register", "Account", FormMethod.Post, new { @id="frmRegister", @class = "form-horizontal", role = "form" }))
{
@Html.AntiForgeryToken()
<h4>Create a new account.</h4>
<hr />
@Html.ValidationSummary("", new { @class = "text-danger" })
<div id="Registration">
<div class="form-group">
@Html.LabelFor(m => m.Email, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.TextBoxFor(m => m.Email, new { @class = "form-control" })
</div>
</div>
</div>
<!--Extended registration fields here. Will be hidden during inital registration. During confirmation these should be visible-->
<div id="Registration_Ext">
<div class="form-group">
@Html.LabelFor(m=> m.DateOfBirth, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.TextBoxFor(m=> m.DateOfBirth, new { @class = "form-control" })
</div>
</div>
<!--Business Ext Registration fields-->
<div id="Business_Ext">
<div class="form-group">
@Html.LabelFor(m => m.BusinessName, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.TextBoxFor(m => m.BusinessName, new { @class = "form-control" })
</div>
</div>
</div>
</div>
<div class="form-group">
<div class="col-md-2 control-label"> </div>
<div class="col-md-10">
<input id="submit" type="submit" class="btn btn-default" value="Register" />
</div>
</div>
}
启动时,我使用 JQuery 隐藏“Registration_Ext”Div,以便 DOB 和 BusinessName 字段不显示:
$(document).ready(function () {
var ctl = $("#Registration_Ext");
ctl.hide();
$("#frmRegister").validate().settings.ignore = ":hidden *";
});
我尝试了几种不同的方法来阻止对非显示字段进行验证。我尝试过的:
1) 禁用隐藏输入的验证
$('#Registration_Ext :input').validate().settings.ignore = '*';
2) 删除元素的验证类
$(this).removeClass('input - validation - error');
3)手动循环“隐藏”输入并关闭其验证属性:
$("#Registration_Ext :input").each(function () {
$(this).attr('data-val', false);
$(this).attr('data-val-required', null);
});
当我读到验证值可以在初始化时缓存时,我还添加了这一点:
$('#frmRegister').removeData('unobtrusiveValidation');
$('#frmRegister').removeData('validator');
$.validator.unobtrusive.parse('#frmRegister');
隐藏字段的验证仍在进行。在服务器( Controller )上,ModelState.IsValid 每次都会返回 false。我在这里做错了什么吗?
最佳答案
ModelState
对象并不关心您在客户端执行的操作。它只是将绑定(bind)对象中的值与该对象上的验证属性进行比较。如果这些字段作为空字符串回发,或者根本不回发,并且它们具有 [Required]
属性,那么它们将无效。
如果不需要这些字段,只需从中删除 [Required]
属性即可。如果它们通常是必需的,但在本例中不是必需的,请创建一个不包含它们或不对它们应用 [Required]
属性的 View 模型,然后使用该 View 模型对于此 View 。
关于javascript - MVC 5 防止隐藏字段的必填字段验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36578745/