我的客户表单中包含CountryCode
,AreaCode
和PhoneNumber
等电话号码字段。我想为这3个字段编写自定义验证,其中所有字段都可以保持为空(它们是可选的),或者所有字段都可以保持填充状态(如果填充了一个或两个字段,则不能将字段留空)。
我试图为这种情况编写自定义验证,但是,我不清楚如何做到这一点。请帮忙。
答案 0 :(得分:0)
目前还不清楚你在这里寻找什么。如果您只是在努力使用布尔逻辑,那么您只需要:
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
是两个字符的国家/地区代码:"美国"," 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;
}