public ActionResult Address(Address address)
        {
            ValidateAddress(address);

            if (ModelState.IsValid) {

                //save the address
                address.AddressID = _customerRepository.SaveAddress(address);
                this.CurrentCart.ShippingAddress = address;

                //calc the tax
                this.CurrentCart.TaxAmount = this.CalculateTax(this.CurrentCart);
                this.CurrentCart.BillingAddress = address;

                //set the shipping methods
                this.ShippingMethods = this.GetShippingMethods(this.CurrentCart);

                //default to the first
                this.CurrentCart.ShippingService = this.ShippingMethods[0].ServiceName;
                this.CurrentCart.ShippingAmount = this.ShippingMethods[0].Cost;
                this.CurrentCart.ShippingMethodID = this.ShippingMethods[0].ID;

                //save the cart
                this.SaveCart();

                //send to billing
                return RedirectToAction("Finalize");
            } else {
                //let error handling pick it up
                return View();
            }
        }
        DbCommand GetAddressCommand(Address address)
        {
            var sql = new SqlStatement(connectionStringName);

            var settings = new Dictionary<string, object>()
                {
                    {AddressesTable.Columns.UserName, address.UserName},
                    {AddressesTable.Columns.FirstName, address.FirstName},
                    {AddressesTable.Columns.LastName, address.LastName},
                    {AddressesTable.Columns.Email, address.Email},
                    {AddressesTable.Columns.Street1, address.Street1},
                    {AddressesTable.Columns.Street2, address.Street2 != null ? address.Street2 : ""},
                    {AddressesTable.Columns.City, address.City},
                    {AddressesTable.Columns.StateOrProvince, address.StateOrProvince},
                    {AddressesTable.Columns.Zip, address.Zip},
                    {AddressesTable.Columns.Country, address.Country},
                    {AddressesTable.Columns.IsDefault, address.IsDefault}
               };

            if (SqlHelper.RecordExists(connectionStringName,AddressesTable.TABLE_NAME, new Dictionary<string, object>()
                {
                    {AddressesTable.Columns.UserName,address.UserName},
                    {AddressesTable.Columns.Street1,address.Street1},
                    {AddressesTable.Columns.City,address.City},
                    {AddressesTable.Columns.StateOrProvince,address.StateOrProvince},
                }))
            {
                //update
                sql = AddressesTable.Update(settings)
                    .Where(AddressesTable.Columns.UserName, address.UserName)
                    .And(AddressesTable.Columns.Street1, address.Street1)
                    .And(AddressesTable.Columns.City, address.City)
                    .And(AddressesTable.Columns.StateOrProvince, address.StateOrProvince);

            } else {
                //insert
                sql = AddressesTable.Insert(settings);

            }
            var cmd = sql.BuildCommand();

            //add the params
            return cmd;
        }
        internal Address LoadAddress(DbDataReader rdr)
        {
            var result=new Address(
                AddressesTable.ReadUserName(rdr),
                AddressesTable.ReadFirstName(rdr),
                AddressesTable.ReadLastName(rdr),
                AddressesTable.ReadEmail(rdr),
                AddressesTable.ReadStreet1(rdr),
                AddressesTable.ReadStreet2(rdr),
                AddressesTable.ReadCity(rdr),
                AddressesTable.ReadStateOrProvince(rdr),
                AddressesTable.ReadZip(rdr),
                AddressesTable.ReadCountry(rdr));

            result.AddressID = AddressesTable.ReadAddressID(rdr);
            return result;
        }
        public int SaveAddress(Address address)
        {
            GetAddressCommand(address).ExecuteNonQuery();

            var sql = string.Format("SELECT MAX({0}) FROM {1} WHERE {2} = @p0",
                AddressesTable.ColumnsQualified.AddressID,
                AddressesTable.TABLE_NAME,
                AddressesTable.ColumnsQualified.UserName);
            var cmd = new SqlStatement(connectionStringName).Add(sql).BuildCommand();
            cmd.AddParameter("@p0", address.UserName);
            object id = cmd.ExecuteScalar();
            return (int)id;
        }
 private void ValidateAddress(Address address)
 {
     // Validation logic
     if (String.IsNullOrEmpty(address.FirstName))
         ModelState.AddModelError("FirstName", "First name is required.");
     if (String.IsNullOrEmpty(address.LastName))
         ModelState.AddModelError("LastName", "Last name is required.");
     if (String.IsNullOrEmpty(address.Email))
         ModelState.AddModelError("Email", "E-mail name is required.");
     if (String.IsNullOrEmpty(address.Street1))
         ModelState.AddModelError("Street1", "Street is required.");
     if (String.IsNullOrEmpty(address.City))
         ModelState.AddModelError("City", "City is required.");
     if (String.IsNullOrEmpty(address.StateOrProvince))
         ModelState.AddModelError("StateOrProvince", "State or province is required.");
     if (String.IsNullOrEmpty(address.Zip))
         ModelState.AddModelError("Zip", "Zip code is required.");
     if (String.IsNullOrEmpty(address.Country))
         ModelState.AddModelError("Country", "Country is required.");
 }