【发布时间】:2014-02-03 16:33:21
【问题描述】:
我试图弄清楚为什么我的FluentValidation 没有不显眼地验证我的某些视图模型属性。
我通过 NuGet 安装了 MVC3 的 FluentValidation 包:
Install-Package FluentValidation.MVC3
结果:
<package id="FluentValidation" version="5.0.0.1" targetFramework="net45" />
<package id="FluentValidation.MVC3" version="5.0.0.1" targetFramework="net45" />
未被验证的属性是 Guitar 类对象的一些成员,在我的视图模型中声明。 Guitar.ProductionYear 属性正在获取不显眼的验证代码,但 Guitar 对象的其他 2 个属性没有。
public Guitar Guitar1 { get; set; }
public Guitar Guitar2 { get; set; }
public Guitar Guitar3 { get; set; }
我阅读了 FluentValidation 文档,现在特别关注 limitations regarding FluentValidation's client-side validation of lists,但这不是一个列表,所以我希望有人能看到问题所在和/或提供一些建议。
我也尝试使用自定义 Guitar 对象验证器,但仍然得到相同的结果
观察
示例
<!-- Unobtrusive JS generated-->
<input type="text" value="" name="FirstName" id="FirstName" data-val-required="'First Name' must not be empty." data-val="true" class="input-validation-error">
<div class="messageBottom">
<span data-valmsg-replace="true" data-valmsg-for="FirstName" class="field-validation-error"><span for="FirstName" generated="true" class="">'First Name' must not be empty.</span>
</span>
</div>
<!-- Unobtrusive JS Partially generated for Guitar object-->
<input type="text" value="" name="Guitar.Make" id="Guitar_Make" placeholder="Make">
<div class="messageBottom">
<span data-valmsg-replace="true" data-valmsg-for="Guitar1.Make" class="field-validation-valid"></span>
</div>
<input type="text" value="" name="Guitar1.Model" id="Guitar1_Model" placeholder="Model">
<div class="messageBottom">
<span data-valmsg-replace="true" data-valmsg-for="Guitar1.Model" class="field-validation-valid"></span>
</div>
<input type="text" value="" name="Guitar1.ProductionYear" id="Guitar1_ProductionYear" data-val-number="The field ProductionYear must be a number." data-val="true" placeholder="Production Year" class="valid">
<div class="messageBottom">
<span data-valmsg-replace="true" data-valmsg-for="Guitar1.ProductionYear" class="field-validation-valid">
</span>
</div>
谢谢
Global.asax.cs
FluentValidationModelValidatorProvider.Configure();
视图模型
[FluentValidation.Attributes.Validator(typeof(CustomerViewModelValidator))]
public class CustomerViewModel
{
[Display(Name = "First Name")]
public string FirstName { get; set; }
[Display(Name = "Last Name")]
public string LastName { get; set; }
[Display(Name = "Phone")]
public string Phone { get; set; }
[Display(Name = "Email")]
public string EmailAddress { get; set; }
[Display(Name = "Guitar 1")]
public Guitar Guitar1 { get; set; }
[Display(Name = "Guitar 2")]
public Guitar Guitar2 { get; set; }
[Display(Name = "Guitar 3")]
public Guitar Guitar3 { get; set; }
}
自定义吉他对象验证器
public class GuitarValidator : AbstractValidator<Guitar>
{
public GuitarValidator()
{
RuleFor(x => x.Make).NotEmpty();
RuleFor(x => x.Model).NotEmpty();
RuleFor(x => x.ProductionYear).NotEmpty();
}
}
视图模型验证器
public class CustomerViewModelValidator : AbstractValidator<CustomerViewModel>
{
public CustomerViewModelValidator()
{
RuleFor(x => x.FirstName).NotNull();
RuleFor(x => x.LastName).NotNull();
RuleFor(x => x.Phone).NotNull();
RuleFor(x => x.EmailAddress).NotNull();
//1st Guitar Object is Required
RuleFor(x => x.Guitar).SetValidator(new GuitarValidator());
}
}
观点
<!-- Guitar Object #1 -->
<div id="cosponsorsTemplate_1">
<div class="formColumn1">@Html.LabelFor(x=>x.Guitar1)</div>
<div class="formColumn2">@Html.TextBoxFor(x => x.Guitar1.Make, new { Placeholder = "Make" })
<div class="messageBottom">@Html.ValidationMessageFor(x => x.Guitar1.Make)</div>
</div>
<div class="formColumn3">@Html.TextBoxFor(x => x.Guitar1.Model, new { Placeholder = "Model" })
<div class="messageBottom">@Html.ValidationMessageFor(x => x.Guitar1.Model)</div>
</div>
<div class="formColumn4">@Html.TextBoxFor(x =>x.Guitar1.ProductionYear, new { Placeholder = "Production Year" })
<div class="messageBottom">@Html.ValidationMessageFor(x => x.Guitar1.ProductionYear)</div>
<a class="icon delete" data-delete-id="1">Delete</a>
</div>
</div>
<!-- Guitar Object #2 -->
<div id="cosponsorsTemplate_2">
<div class="formColumn1">@Html.LabelFor(x=>x.Guitar2)</div>
<div class="formColumn2">@Html.TextBoxFor(x => x.Guitar2.Make, new { Placeholder = "Make" })
<div class="messageBottom">@Html.ValidationMessageFor(x => x.Guitar2.Make)</div>
</div>
<div class="formColumn3">@Html.TextBoxFor(x => x.Guitar2.Model, new { Placeholder = "Model" })
<div class="messageBottom">@Html.ValidationMessageFor(x => x.Guitar2.Model)</div>
</div>
<div class="formColumn4">@Html.TextBoxFor(x => x.Guitar2.ProductionYear, new { Placeholder = "Production Year" })
<div class="messageBottom">@Html.ValidationMessageFor(x => x.Guitar2.ProductionYear)</div>
<a class="icon delete" data-delete-id="2">Delete</a>
</div>
</div>
<!-- Guitar Object #3 -->
<div id="cosponsorsTemplate_3">
<div class="formColumn1">@Html.LabelFor(x=>x.Guitar3)</div>
<div class="formColumn2">@Html.TextBoxFor(x => x.Guitar3.Make, new { Placeholder = "Make" })
<div class="messageBottom">@Html.ValidationMessageFor(x => x.Guitar3.Make)</div>
</div>
<div class="formColumn3">@Html.TextBoxFor(x => x.Guitar3.Model, new { Placeholder = "Model" })
<div class="messageBottom">@Html.ValidationMessageFor(x => x.Guitar3.Model)</div>
</div>
<div class="formColumn4">@Html.TextBoxFor(x => x.Guitar3.ProductionYear, new { Placeholder = "Production Year" })
<div class="messageBottom">@Html.ValidationMessageFor(x => x.Guitar3.ProductionYear)</div>
<a class="icon delete" data-delete-id="3">Delete</a>
</div>
</div>
【问题讨论】:
标签: c# asp.net-mvc-3 fluentvalidation