0

我用谷歌搜索了答案,并在主题中发现了许多问题和博客文章。许多看起来很复杂的方式,有些是不完整的。

我有一个具有 2 个类型属性的 Customer 对象Address。1 是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,那么ShippingAddressEditorTemplate 会在必填字段上显示错误。

我可以[Required]从地址类中删除属性,并在表单发布后在服务器端手动验证。在这种情况下对我来说效果很好。我还需要知道如何手动将客户端验证绑定到现有的 mvc 验证中?或者请给我建议一个更好的方法来实现这个目标。

4

1 回答 1

0

我建议您尝试fluentValidation它也在 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 );
    }
}


请注意,您还必须为您的 Address 类指定一个验证器并添加属性)

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

最后添加FluentValidationModelValidatorProvider.Configure();到您的 application_start

于 2013-01-09T10:09:30.743 回答