1

I'm building some custom validation to verify Vehicle Identification Numbers (VINs) in a small LightSitch application. The custom validation is pretty simple for the most part, but I'm using code similar to what has been copied below from Rusty Davis' post at http://shapemetrics.wordpress.com/2010/08/23/vin-validation/.

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

The problem that I'm running into is that Visual Studio is telling me that "'System.Text.Encoding' does not contain a definition for 'ASCII'". It also says that the type or namespace "Hashtable" could not be found.

Are these not available in LightSwitch projects? I've got all of the correct using statements. I'm confused.

Bryan Hong
  • 1,483
  • 13
  • 28
nlinus
  • 641
  • 5
  • 12

2 Answers2

1

Since Lightswitch is a Silverlight application, thus the ascii encoding is not available, see this link. It suggests for you to try using Encoding.UTF8 instead.

As for the Hashtable, it's also not supported in Silverlight. The alternative is to use Dictionary <Tkey, TValue> instead. See this link.

The updated code would look like this (untested code):

        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;
Community
  • 1
  • 1
Bryan Hong
  • 1,483
  • 13
  • 28
0

You may want to look at more recent versions of the code also. The one you have there gives a basic Boolean answer.

Instead there is another located on the website that reflects more detailed messages located here: http://shapemetrics.wordpress.com/2011/12/05/vin-validate-improved

Blazemonger
  • 90,923
  • 26
  • 142
  • 180
  • Thanks Rusty. I had made some changes that gave a Boolean response. – nlinus Dec 14 '12 at 17:04
  • I created a web service, if anyone is interested. I am working to add both make/model to the database. However it is able to provide more detailed information just as the link above with a few additions. http://shapemetrics.wordpress.com/2013/08/16/vin-decoding-webservice-update/ – Rusty Davis Sep 04 '13 at 13:26