Asp.net mvc 3 在客户端执行条件验证的简单方法是什么?

Asp.net mvc 3 在客户端执行条件验证的简单方法是什么?,asp.net-mvc-3,validation,client-side-validation,Asp.net Mvc 3,Validation,Client Side Validation,我在谷歌上搜索答案,在主题中发现了许多问题和博客帖子。很多看起来很复杂,有些是不完整的 我有一个Customer对象,其类型为Address,具有2个属性。一个是BillingAddress,另一个是ShippingAddress。在表单中,我使用EditorTemplate作为地址类型。用户可以选择ShippingAddress是否与BillingAddress相同 public class Customer { public virtual string CustomerName {

我在谷歌上搜索答案,在主题中发现了许多问题和博客帖子。很多看起来很复杂,有些是不完整的

我有一个Customer对象,其类型为
Address
,具有2个属性。一个是BillingAddress,另一个是ShippingAddress。在表单中,我使用EditorTemplate作为地址类型。用户可以选择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验证中?或者请给我一个更好的方法来实现这个目标。

我建议你也可以在NUGET上作为一个包来试用它

您可以更好地控制验证,在我看来,这是一种比使用属性更干净的方法。简短示例:

[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 );
    }
}
[验证器(类型(CustomerValidator))]
公共类客户{
公共虚拟字符串CustomerName{get;set;}
公共虚拟字符串标题{get;set;}
公共虚拟地址计费地址{get;set;}
公共虚拟地址ShippingAddress{get;set;}
公共虚拟bool ShippingSameAsBilling{get;set;}
//续。。
}
公共类CustomerValidator:AbstractValidator{
公共CustomerValidator(){
规则(x=>x.CustomerName).Length(0,10);
RuleFor(x=>x.Email).EmailAddress();
(x=>x.ShippingAddress).NotEmpty()的规则
.When(customer=>!customer.ShippingSameAsBilling);
}
}

注意还必须为Address类指定验证器并添加属性)

查看如何禁用发货地址验证,因为我不确定NotEmpty()是否正确,您可能需要查看.Must()或SetValidator()


最后添加
FluentValidationModelValidatorProvider.Configure()
到您的应用程序\u start

另一个很好使用的库是。谢谢@Synergy。顺便说一句,在上面的类“CustomerValidator”中,我可以看到第一行是“public PersonValidator()”,这是错误的吗?代表构造函数的应该是“public CustomValidator”???请确认。@BlueBird-您确实注意到它确实是
公共客户验证程序
。我读了您的问题,您说的是客户端。但根据显示的代码,我以为你指的是正面。不幸的是,你必须自己写这些规则。你可以看看这个博客。我希望你能开始。