我不确定它是否是一个错误但是如果一个实体本身包含另一个实体,MVC 5(也是3和4)不处理客户端表单验证。所以我的方案是创建一个视图模型,该模型引用其他具有[必需]等验证注释的域模型。如:
public class Membership
{
public Company Company { get; set; }
public User User{ get; set; }
[Required(ErrorMessage = "{0} can not be empty")]
public string Type{ get; set; }
}
public class User
{
[Required]
public string UserName {get; set;}
//..... so on
}
public class Company
{
[Required]
public string CompanyName {get; set;}
//..... so on
}
当我使用会员实体作为我的注册表单的ViewModel时,验证仅适用于Type属性,但不适用于相关实体User和Company。
根据我的经验,此视图模型为相关实体创建以下客户端dom对象:
<input aria-invalid="true" aria-required="true" data-val="true" data-val-required="Company Name can not be empty" id="Company.CompanyName" name="Company.CompanyName" value="" type="text">
您可能会清楚地注意到id和name dom属性中的对象和属性之间存在点(。)。我确信jquery无法读取这种选择器(内部有点),这可能会导致验证器出现故障。
你有什么想法吗?
更新
我的观点的表格部分简述如下:
@using (Html.BeginForm("Membership", "Account", FormMethod.Post, new { @class = "seperate-sections fill-up" }))
{
<div class="form-group">
<div class="input-group addon-left">
<span class="input-group-addon"><i class="icon-user"></i></span>
@Html.EditorFor(m => m.Company.CompanyName)
</div>
@Html.ValidationMessageFor(m => m.Company.CompanyName)
</div>
<div class="form-group">
<div class="input-group addon-left">
<span class="input-group-addon"><i class="icon-user"></i></span>
@Html.EditorFor(m => m.User.UserName)
</div>
@Html.ValidationMessageFor(m => m.User.UserName)
</div>
}
包含的脚本是:
<script src="/scripts/jquery.validate.min.js?v=8d16f4c1ca0f151" type="text/javascript"></script>
<script src="/scripts/jquery.validate.additional-methods.js?v=8d1428a3c3f3399" type="text/javascript"></script>
<script src="/scripts/jquery.validate.unobtrusive.js?v=8d1765d406515b4" type="text/javascript"></script>
<script src="/scripts/jquery.unobtrusive-ajax.js?v=8d16f4c32f4bcea" type="text/javascript"></script>