【问题标题】:Write Custom Validation for Multiple Fields using MVC使用 MVC 为多个字段编写自定义验证
【发布时间】:2017-09-27 15:11:14
【问题描述】:

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

【问题讨论】:

标签: asp.net-mvc validation


【解决方案1】:

目前尚不清楚您在此处寻找的确切内容。如果您只是在为布尔逻辑苦苦挣扎,那么您只需要:

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

【讨论】:

  • 谢谢伙计。这很有帮助。
猜你喜欢
  • 2017-06-21
  • 1970-01-01
  • 2012-11-30
  • 2017-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多