我有一个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; }
}
和以下观点:
@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>
}
&#13;
在启动时,我使用JQuery来隐藏&#34; Registration_Ext&#34; 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)通过&#34;隐藏&#34;手动循环输入并关闭其验证属性:
$("#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。我在这里做错了吗?
答案 0 :(得分:1)
ModelState
对象并不关心您在客户端执行的操作。它只是将绑定对象中的值与该对象上的验证属性进行比较。如果这些字段作为空字符串回发,或者根本没有回发,并且它们具有[Required]
属性,那么它们将无法生效。
如果不需要这些字段,只需从中删除[Required]
属性即可。如果他们通常需要,但不是在这种情况下,请创建一个既不包含它们的视图模型,也不会将[Required]
属性应用于它们,并使用该视图这种观点的模型。
答案 1 :(得分:0)
请检查一下。
<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 ignore" })
</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 ignore" })
</div>
</div>
</div>
</div>
使用表单ID禁用对所选控件的验证。 '.ignore'是一个放在您不想验证的控件上的类。另外,不要使用服务器端验证,在表单提交时使用'$('#frmRegister')。valid()'来检查其他字段的验证。
$("#frmRegister").data("validator").settings.ignore = ".ignore, :hidden";