我可以使用数据注释来指定具有必需属性的可选对象属性吗?

问题描述 投票:0回答:1

我有一个简单的成员注册数据模型,其中包含一些必需的属性和一些可选属性。 BillToAddress属性是可选的。

public class MemberRegistration
{
    [Required(ErrorMessage = "First Name is required.")]
    public string FirstName { get; set; }

    [Required(ErrorMessage = "Last Name is required.")]
    public string LastName { get; set; }

    [Required(ErrorMessage = "Email Address is required.")]
    public string EmailAddress { get; set; }

    public string PhoneNumber { get; set; }

    [Required(ErrorMessage = "Password is required.")]
    [MinLength(7, ErrorMessage = "Password must be at least 7 characters.")]
    public string Password { get; set; }

    private Address m_BillToAddress;
    public Address BillToAddress
    {
        get
        {
            if (m_BillToAddress == null)
            {
                m_BillToAddress = new Address();
            }
            return m_BillToAddress;
        }
    }
}

如果用户输入可选的账单地址,我希望需要街道,城市,国家和邮政编码。所以我定义了地址数据模型,根据需要标记这些属性。

public class Address
{
    [Required(ErrorMessage = "Street Line 1 is required.")]
    public string Street1 { get; set; }

    public string Street2 { get; set; }

    public string Street3 { get; set; }

    public string Street4 { get; set; }

    public string Street5 { get; set; }

    [Required(ErrorMessage = "City is required.")]
    public string City { get; set; }

    [Required(ErrorMessage = "State or Province is required.")]
    public string StateOrProvince { get; set; }

    [Required(ErrorMessage = "Country is required.")]
    public string Country { get; set; }

    [Required(ErrorMessage = "Postal Code is required.")]
    public string PostalCode { get; set; }
}

但是,当我没有提供要解决的账单时,现在模型验证失败了。我如何注释我的模型,以便要解决的账单是可选的,但如果提供,那么它必须包括街道,城市,国家和邮政编码?

data-annotations
1个回答
0
投票

问题出在MemberRegistration类中。因为BillToAddress属性getter总是返回一个新的空Address模型,所以BillToAddress永远不会为null并始终正确触发Address类验证。我将BillToAddress更改为一个简单的自动实现属性:

public Address BillToAddress { get; set; }

现在,如果我发布没有BillToAddress的MemberRegistion,它会通过验证,因为BillToAddress是一个可选属性。

© www.soinside.com 2019 - 2024. All rights reserved.