我搜索了答案,我在主题中发现了许多问题和博文。许多似乎非常复杂,有些是不完整的。
我有一个Customer对象,其中包含2个Address
类型的属性。 1是 BillingAddress ,另一个是 ShippingAddress 。在表单中,我使用EditorTemplate作为Address类型。用户可以选择ShippingAddress是否与BillingAddress相同。
public class Customer
{
public virtual string CustomerName { get; set; }
public virtual string Title { get; set; }
public virtual Address BillingAddress { get; set; }
public virtual Address ShippingAddress { get; set; }
public virtual bool ShippingSameAsBilling { get; set; }
// Cont..
}
public class Address
{
public virtual string AddressLine { get; set; }
[Required]
public virtual string City { get; set; }
// Cont..
}
注意:我的public virtual bool ShippingSameAsBilling { get; set; }
我的问题是,我需要对Address属性进行验证,这是一种具有必填字段的Address
类。如果用户没有选择“送货地址与帐单地址相同”,一切正常。如果他/她选择它们并且仅填充BillingAddress
,则ShippingAddress
EditorTemplate会在必填字段上显示错误。
我可以从Address类中删除[Required]
属性,并在发布表单后在服务器端手动验证。它对我来说在这种情况下会很好用。另外我需要知道如何将客户端验证手动绑定到现有的mvc验证中?或者请建议我更好地实现这一目标。
答案 0 :(得分:0)
我建议你在NUGET上尝试fluentValidation作为一个包。
您可以更好地控制验证,在我看来,这是一种更清晰的方式,然后使用属性。简短的例子:
[Validator(typeof(CustomerValidator))]
public class Customer{
public virtual string CustomerName { get; set; }
public virtual string Title { get; set; }
public virtual Address BillingAddress { get; set; }
public virtual Address ShippingAddress { get; set; }
public virtual bool ShippingSameAsBilling { get; set; }
// Cont..
}
public class CustomerValidator : AbstractValidator<Customer> {
public CustomerValidator() {
RuleFor(x => x.CustomerName ).Length(0, 10);
RuleFor(x => x.Email).EmailAddress();
RuleFor(x => x.ShippingAddress).NotEmpty()
.When(customer => !customer.ShippingSameAsBilling );
}
}
(注意您必须为您的Address类指定验证器并添加属性)
通过documentation查看如何禁用送货地址的验证,因为我不确定NotEmpty()是否正确,您可能希望查看.Must()或SetValidator()。
最后将FluentValidationModelValidatorProvider.Configure();
添加到您的application_start