使用MVC为多个字段编写自定义验证

时间:2017-09-27 15:11:14

标签: asp.net-mvc validation

我的客户表单中包含CountryCodeAreaCodePhoneNumber等电话号码字段。我想为这3个字段编写自定义验证,其中所有字段都可以保持为空(它们是可选的),或者所有字段都可以保持填充状态(如果填充了一个或两个字段,则不能将字段留空)。 我试图为这种情况编写自定义验证,但是,我不清楚如何做到这一点。请帮忙。

1 个答案:

答案 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;
}