我有一个简单的成员注册数据模型,其中包含一些必需的属性和一些可选属性。 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; }
}
但是,当我没有提供要解决的账单时,现在模型验证失败了。我如何注释我的模型,以便要解决的账单是可选的,但如果提供,那么它必须包括街道,城市,国家和邮政编码?
问题出在MemberRegistration类中。因为BillToAddress属性getter总是返回一个新的空Address模型,所以BillToAddress永远不会为null并始终正确触发Address类验证。我将BillToAddress更改为一个简单的自动实现属性:
public Address BillToAddress { get; set; }
现在,如果我发布没有BillToAddress的MemberRegistion,它会通过验证,因为BillToAddress是一个可选属性。