在客户端进行条件验证的简单方法是什么?

时间:2013-01-09 09:12:05

标签: asp.net-mvc-3 validation client-side-validation

我搜索了答案,我在主题中发现了许多问题和博文。许多似乎非常复杂,有些是不完整的。

我有一个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验证中?或者请建议我更好地实现这一目标。

1 个答案:

答案 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