【问题标题】:VIN Number Validation Using ASP.NET MVC使用 ASP.NET MVC 验证 VIN 号
【发布时间】:2013-12-12 13:06:00
【问题描述】:

我正在将 MVC 4 用于当前项目。项目通常处理车辆并确定不同用途的正确车辆。

我有以下型号。

public class Vehicle
{
   [Required]
   public string VIN{get; set;}
   //
}

我想验证输入的 VIN 号码是否正确。我不确定验证 VIN 号码之类的正确/最简单的方法是什么。我看过一些验证示例,似乎没有一个对我有用。在客户端验证方面需要一些帮助。谢谢。

【问题讨论】:

    标签: c# asp.net asp.net-mvc validation asp.net-mvc-4


    【解决方案1】:

    我在自己的项目中使用正则表达式来验证 VIN。试试下面的例子:

    public class Vehicle
    {
        [RegularExpression("[A-HJ-NPR-Z0-9]{13}[0-9]{4}", ErrorMessage = "Invalid Vehicle Identification Number Format.")]
        public string VIN { get; set; }
    }
    

    VIN 通常由 17 个字符组成。

    VIN 的第一个字母或数字告诉您您的车辆是在世界哪个地区制造的。

    第二个字母或数字与 VIN 中的第一个字母或数字相结合,告诉您汽车或卡车是在哪个国家/地区制造的。

    车辆制造商使用第三个数字或字母来识别它是什么类型的车辆。

    第4、5、6、7、8字,可以查到车型、发动机类型、车身样式。

    第 9 个字符是 VIN 校验位,您可以在其中使用数学来确定它是否是正确的 VIN。

    VIN 的第 10 个字母或数字告诉您车辆的型号年份。

    11th 12th 13th 14th 15th 16th 字符是汽车制造商输入有关 VIN 所属特定车辆的唯一信息的位置。

    希望对你有帮助!

    【讨论】:

      【解决方案2】:

      VIN 使用第 9 位的校验位和您可以很容易找到的公式进行验证。这是我编写的验证的 VB 版本。我是一个新的 VB 程序员,所以我确信有更优雅的方法,但逻辑是正确的......“all one's”(见注释行)是对任何 VIN 验证算法的一个很好的检查。

      Function ValidateVin(vin As String) As Boolean
              'Dim vin As String = "2G1FC3D33C9165616"
              'Dim vin As String = "11111111111111111"
              Dim vinCharArray() = vin.ToCharArray()
              Dim result As Int32
              Dim index As Int32 = 0
              Dim checkDigit As Int32
              Dim checkSum As Int32 = 0
              Dim weight As Int32
      
              If vin.Length <> 17 Then
                  Console.WriteLine(vbCrLf + "Supplied VIN does not have 17 characters, please check and try again" + vbCrLf)
                  Return False
              Else
                  For Each i As Char In vinCharArray
                      index += 1
                      If Asc(i) > 47 And Asc(i) < 58 Then
                          result = Int32.Parse(i)
                      Else
                          Select Case Char.ToLower(i)
                              Case "a", "j"
                                  result = 1
                              Case "b", "k", "s"
                                  result = 2
                              Case "c", "l", "t"
                                  result = 3
                              Case "d", "m", "u"
                                  result = 4
                              Case "e", "n", "v"
                                  result = 5
                              Case "f", "w"
                                  result = 6
                              Case "g", "p", "x"
                                  result = 7
                              Case "h", "y"
                                  result = 8
                              Case "r", "z"
                                  result = 9
                          End Select
                      End If
                      Select Case index
                          Case 1 To 7, 9
                              weight = 9 - index
                          Case 8
                              weight = 10
                          Case 10 To 17
                              weight = 19 - index
                      End Select
                      If index = 9 Then
                          If Char.ToLower(i) = "x" Then
                              checkDigit = 10
                          Else
                              checkDigit = result
                          End If
                      End If
                      'Console.WriteLine("Index {0} has a value of {1} and a weight of {2}", index, result, weight)
                      checkSum += (result * weight)
                  Next
      
                  'Console.WriteLine("checksum is {0}", checkSum)
                  'Console.WriteLine("checkdigit is {0}", checkDigit)
      
                  Dim checksOut As Boolean
      
                  If checkSum Mod 11 = checkDigit Then
                      checksOut = True
                  End If
      
                  'Console.WriteLine(checksOut)
                  'Console.ReadLine()
      
                  Return checksOut
      
              End If
          End Function
      

      【讨论】:

        【解决方案3】:

        这是 C# 中的@hardknocks 答案

        public static bool ValidateVin(string vin)
        {
            if (vin.Length != 17)
                return false;
            var result = 0;
            var index = 0;
            var checkDigit = 0;
            var checkSum = 0;
            var weight = 0;
            foreach (var c in vin.ToCharArray())
            {
                index++;
                var character = c.ToString().ToLower();
                if (char.IsNumber(c))
                    result = int.Parse(character);
                else
                {
                    switch (character)
                    {
                        case "a":
                        case "j":
                            result = 1;
                            break;
                        case "b":
                        case "k":
                        case "s":
                            result = 2;
                            break;
                        case "c":
                        case "l":
                        case "t":
                            result = 3;
                            break;
                        case "d":
                        case "m":
                        case "u":
                            result = 4;
                            break;
                        case "e":
                        case "n":
                        case "v":
                            result = 5;
                            break;
                        case "f":
                        case "w":
                            result = 6;
                            break;
                        case "g":
                        case "p":
                        case "x":
                            result = 7;
                            break;
                        case "h":
                        case "y":
                            result = 8;
                            break;
                        case "r":
                        case "z":
                            result = 9;
                            break;
                    }
                }
        
                if (index >= 1 && index <= 7 || index == 9)
                    weight = 9 - index;
                else if (index == 8)
                    weight = 10;
                else if (index >= 10 && index <= 17)
                    weight = 19 - index;
                if (index == 9)
                    checkDigit = character == "x" ? 10 : result;
                checkSum += (result * weight);
            }
        
            return checkSum % 11 == checkDigit;
        }
        

        【讨论】:

          【解决方案4】:

          您可以在此处验证两件事:

          1. 提供的 VIN 是否正确。您可以通过计算校验位并将其与数字中的一位进行比较来检查。但是,它不适用于所有制造商。在维基百科上查看更多信息:Vehicle identification number: Check digit calculation

          2. 检查 VIN 是否与其他汽车详细信息(品牌、型号等)匹配。为此,您必须有权访问某些数据库。我认为您还没有,因此您必须先查找一个,然后使用它的公共 API 或复制数据并编写自己的 API,然后使用它来验证用户数据。

            李>

          【讨论】:

          • 我测试了该正则表达式,但它在某些实际 vin 和 Wikipedia (1HGBG41JXMN109186) 提供的示例上失败了。我发现这个对我来说效果更好:[a-zA-Z0-9]{9}[a-zA-Z0-9-]{2}[0-9]{6} 当然,对于校验和(第 9 个字符),任何字母或数字都是那里的接受者。
          猜你喜欢
          • 2011-06-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多