目前尚不清楚您在此处寻找的确切内容。如果您只是在为布尔逻辑苦苦挣扎,那么您只需要:
if (!String.IsNullOrWhiteSpace(model.CountryCode) ||
!String.IsNullOrWhiteSpace(model.AreaCode) ||
!String.IsNullOrWhiteSpace(model.PhoneNumber))
{
if (String.IsNullOrWhiteSpace(model.CountryCode)
{
ModelState.AddModelError(nameof(model.CountryCode), "Country code is required.");
}
if (String.IsNullOrWhiteSpace(model.AreaCode)
{
ModelState.AddModelError(nameof(model.AreaCode), "Area code is required.");
}
if (String.IsNullOrWhiteSpace(model.PhoneNumber)
{
ModelState.AddModelError(nameof(model.PhoneNumber), "Phone number is required.");
}
}
基本上,您只需首先检查其中是否有任何值。然后,您为每个没有值的错误单独添加一个错误。
也就是说,这些破碎的电话号码字段非常糟糕。我不确定这个想法是从哪里来的,但就像你现在无法让人们离开他们一样。电话号码格式各不相同非常,并不是每个电话号码实际上都有一个“区号”。 远最好有一个“电话”字段,用户可以在其中简单地输入他们的整个电话号码。然后,您可以使用类似port of Google's libphonenumber library 的方法来验证数字并将其格式化为标准形式。如果您需要像这样存储它,您甚至可以使用该库来解析国家代码、区号和号码的各个部分。只需准备好区号可能没有值,即使有,也可能不是 3 位数。数字部分也是如此:你不能假设它总是 7。
验证电话号码
var phoneUtil = PhoneNumberUtil.GetInstance();
try {
var phoneNumber = phoneUtil.Parse(model.Phone, countryISO2);
if (!phoneUtil.IsValidNumber(phoneNumber))
{
ModelState.AddModelError(nameof(model.Phone), "Invalid phone number.");
}
} catch (NumberParseException) {
ModelState.AddModelError(nameof(model.Phone), "Invalid phone number.");
}
其中countryISO2是两个字符的国家代码:“US”、“GB”等。如果你想接受国际电话号码,你应该从用户那里收集国家。
格式化电话号码
phoneUtil.Format(phoneNumber, PhoneNumberFormat.NATIONAL);
获取电话号码的组成部分
var countryCode = phoneNumber.CountryCode;
string areaCode;
string number;
var nationalSignificantNumber = phoneUtil.GetNationalSignificantNumber(phoneNumber);
var areaCodeLength = phoneUtil.GetLengthOfGeographicalAreaCode(phoneNumber);
if (areaCodeLength > 0) {
areaCode = nationalSignificantNumber.Substring(0, areaCodeLength);
number = nationalSignificantNumber.Substring(areaCodeLength);
} else {
areaCode = "";
number = nationalSignificantNumber;
}