2012-12-04 262 views
1

我正在构建一些自定义验证以验证小型LightSitch应用程序中的车辆识别号(VIN)。自定义验证大部分非常简单,但我使用的代码类似于以下从Rusty Davis的文章http://shapemetrics.wordpress.com/2010/08/23/vin-validation/中复制的代码。Lightswitch VIN自定义验证

public class VIN 
    { 
     //Make sure no instance of this class is created... only method is static. 
     private VIN() { } 

     public static bool IsValidVin(string p_strVin) 
     { 
      bool blnIsValid = false; 
      int intValue = 0; 
      int[] intWeights = { 8, 7, 6, 5, 4, 3, 2, 10, 0, 9, 8, 7, 6, 5, 4, 3, 2 }; 

      if (p_strVin == null) 
      { 
       return false; 
      } 
      else if (p_strVin.Length != 17) 
      { 
       return blnIsValid; 
      } 

      p_strVin = p_strVin.ToUpper().Trim(); 
      int intCheckValue = 0; 
      char check = p_strVin[8]; 
      char year = p_strVin[9]; 

      if (!char.IsDigit(check) && check != 'X') 
      { 
       return blnIsValid; 
      } 
      else 
      { 
       if (check != 'X') 
       { 
        char[] d = new char[] { check }; 
        intCheckValue = int.Parse(Encoding.ASCII.GetString(Encoding.ASCII.GetBytes(d))); 
       } 
       else 
       { 
        intCheckValue = 10; 
       } 
      } 

      Hashtable replaceValues = new Hashtable(); 
      replaceValues.Add('A', 1); 
      replaceValues.Add('B', 2); 
      replaceValues.Add('C', 3); 
      replaceValues.Add('D', 4); 
      replaceValues.Add('E', 5); 
      replaceValues.Add('F', 6); 
      replaceValues.Add('G', 7); 
      replaceValues.Add('H', 8); 
      replaceValues.Add('J', 1); 
      replaceValues.Add('K', 2); 
      replaceValues.Add('L', 3); 
      replaceValues.Add('M', 4); 
      replaceValues.Add('N', 5); 
      replaceValues.Add('P', 7); 
      replaceValues.Add('R', 9); 
      replaceValues.Add('S', 2); 
      replaceValues.Add('T', 3); 
      replaceValues.Add('U', 4); 
      replaceValues.Add('V', 5); 
      replaceValues.Add('W', 6); 
      replaceValues.Add('X', 7); 
      replaceValues.Add('Y', 8); 
      replaceValues.Add('Z', 9); 
      replaceValues.Add('1', 1); 
      replaceValues.Add('2', 2); 
      replaceValues.Add('3', 3); 
      replaceValues.Add('4', 4); 
      replaceValues.Add('5', 5); 
      replaceValues.Add('6', 6); 
      replaceValues.Add('7', 7); 
      replaceValues.Add('8', 8); 
      replaceValues.Add('9', 9); 
      replaceValues.Add('0', 0); 

      //Make sure it is a Valid Year 
      if (!replaceValues.Contains(year) && year != '0') 
      { 
       return blnIsValid; 
      } 

      //Make sure characters that are in the VIN are the ones allowed. 
      for (int i = 0; i < p_strVin.Length; i++) 
      { 
       if (!replaceValues.Contains(p_strVin[i])) 
       { 
        return false; 
       } 
       intValue += (intWeights[i] * ((int)replaceValues[p_strVin[i]])); 
      } 

      if ((intValue % 11) == intCheckValue) 
      { 
       blnIsValid = true; 
      } 

      return blnIsValid; 
     } 
    } 

,我快到的问题是,Visual Studio的告诉我说:“‘System.Text.Encoding’不包含‘ASCII’的定义。”它还表示无法找到类型或命名空间“Hashtable”。

这些在LightSwitch项目中不可用吗?我已经得到了所有正确的使用陈述。我很困惑。

回答

1

由于Lightswitch是Silverlight应用程序,因此ascii编码不可用,see this link.它建议您尝试使用Encoding.UTF8代替。

至于Hashtable,它在Silverlight中也不受支持。替代方案是使用Dictionary <Tkey, TValue>See this link.

更新的代码看起来像这样(未测试的代码):

 bool blnIsValid = false; 
     int intValue = 0; 
     int[] intWeights = { 8, 7, 6, 5, 4, 3, 2, 10, 0, 9, 8, 7, 6, 5, 4, 3, 2 }; 

     if (p_strVin == null) 
     { 
      return false; 
     } 
     else if (p_strVin.Length != 17) 
     { 
      return blnIsValid; 
     } 

     p_strVin = p_strVin.ToUpper().Trim(); 
     int intCheckValue = 0; 
     char check = p_strVin[8]; 
     char year = p_strVin[9]; 

     if (!char.IsDigit(check) && check != 'X') 
     { 
      return blnIsValid; 
     } 
     else 
     { 
      if (check != 'X') 
      { 
       char[] d = new char[] { check }; 
       var bytes = Encoding.UTF8.GetBytes(d); 
       intCheckValue = int.Parse(Encoding.UTF8.GetString(bytes, 0, bytes.Length)); 
      } 
      else 
      { 
       intCheckValue = 10; 
      } 
     } 

     Dictionary<char, int> replaceValues = new Dictionary<char, int>(); 
     replaceValues.Add('A', 1); 
     replaceValues.Add('B', 2); 
     replaceValues.Add('C', 3); 
     replaceValues.Add('D', 4); 
     replaceValues.Add('E', 5); 
     replaceValues.Add('F', 6); 
     replaceValues.Add('G', 7); 
     replaceValues.Add('H', 8); 
     replaceValues.Add('J', 1); 
     replaceValues.Add('K', 2); 
     replaceValues.Add('L', 3); 
     replaceValues.Add('M', 4); 
     replaceValues.Add('N', 5); 
     replaceValues.Add('P', 7); 
     replaceValues.Add('R', 9); 
     replaceValues.Add('S', 2); 
     replaceValues.Add('T', 3); 
     replaceValues.Add('U', 4); 
     replaceValues.Add('V', 5); 
     replaceValues.Add('W', 6); 
     replaceValues.Add('X', 7); 
     replaceValues.Add('Y', 8); 
     replaceValues.Add('Z', 9); 
     replaceValues.Add('1', 1); 
     replaceValues.Add('2', 2); 
     replaceValues.Add('3', 3); 
     replaceValues.Add('4', 4); 
     replaceValues.Add('5', 5); 
     replaceValues.Add('6', 6); 
     replaceValues.Add('7', 7); 
     replaceValues.Add('8', 8); 
     replaceValues.Add('9', 9); 
     replaceValues.Add('0', 0); 

     //Make sure it is a Valid Year 
     if (!replaceValues.ContainsKey(year) && year != '0') 
     { 
      return blnIsValid; 
     } 

     //Make sure characters that are in the VIN are the ones allowed. 
     for (int i = 0; i < p_strVin.Length; i++) 
     { 
      if (!replaceValues.ContainsKey(p_strVin[i])) 
      { 
       return false; 
      } 
      intValue += (intWeights[i] * ((int)replaceValues[p_strVin[i]])); 
     } 

     if ((intValue % 11) == intCheckValue) 
     { 
      blnIsValid = true; 
     } 

     return blnIsValid; 
0

你可能想看看在较新版本的代码也。你在那里得到一个基本的布尔答案。

取而代之的是另一个位于反映设在这里更详细的信息在网站上:http://shapemetrics.wordpress.com/2011/12/05/vin-validate-improved

+0

由于生锈。我做了一些布尔响应的修改。 – nlinus

+0

如果有人感兴趣,我创建了一个Web服务。我正在努力为数据库添加make/model。但是它能够提供更详细的信息,就像上面的链接和一些附加内容一样。 http://shapemetrics.wordpress.com/2013/08/16/vin-decoding-webservice-update/ –