ASP.NET Podcast Show #148 - ASP.NET WebForms to build a Mobile Web Application

Check the podcast site for the original url.

This is the video and source code for an ASP.NET WebForms app that I wrote that is optimized for the iPhone and mobile environments. 

Subscribe to everything.

Subscribe to WMV.

Subscribe to M4V for iPhone/iPad.

Subscribe to MP3.

Download WMV.

Download M4V for iPhone/iPad.

Download MP3.

Link to iWebKit.

Source Code:

<%@ Page Title="MapSplore" Language="C#" MasterPageFile="iPhoneMaster.master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="AT_iPhone_Default" %>

<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="Content" Runat="Server" ClientIDMode="Static">
    <asp:ScriptManager ID="sm" runat="server"
        EnablePartialRendering="true" EnableHistory="false" EnableCdn="true" />
    <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=true"></script>
    <script  language="javascript"  type="text/javascript">
    <!--
    Sys.WebForms.PageRequestManager.getInstance().add_endRequest(endRequestHandle);
    function endRequestHandle(sender, Args) {
        setupMapDiv();
        setupPlaceIveBeen();
    }
    function setupPlaceIveBeen() {
        var mapPlaceIveBeen = document.getElementById('divPlaceIveBeen');
        if (mapPlaceIveBeen != null) {
            var PlaceLat = document.getElementById('<%=hdPlaceIveBeenLatitude.ClientID %>').value;
            var PlaceLon = document.getElementById('<%=hdPlaceIveBeenLongitude.ClientID %>').value;
            var PlaceTitle = document.getElementById('<%=lblPlaceIveBeenName.ClientID %>').innerHTML;
            var latlng = new google.maps.LatLng(PlaceLat, PlaceLon);
            var myOptions = {
                zoom: 14,
                center: latlng,
                mapTypeId: google.maps.MapTypeId.ROADMAP
            };
            var map = new google.maps.Map(mapPlaceIveBeen, myOptions);
            var marker = new google.maps.Marker({
                position: new google.maps.LatLng(PlaceLat, PlaceLon),
                map: map,
                title: PlaceTitle,
                clickable: false
            });
        }
    }
    function setupMapDiv() {
        var mapdiv = document.getElementById('divImHere');
        if (mapdiv != null) {
            var PlaceLat = document.getElementById('<%=hdPlaceLat.ClientID %>').value;
            var PlaceLon = document.getElementById('<%=hdPlaceLon.ClientID %>').value;
            var PlaceTitle = document.getElementById('<%=hdPlaceTitle.ClientID %>').value;
            var latlng = new google.maps.LatLng(PlaceLat, PlaceLon);
            var myOptions = {
                zoom: 14,
                center: latlng,
                mapTypeId: google.maps.MapTypeId.ROADMAP
            };
            var map = new google.maps.Map(mapdiv, myOptions);
            var marker = new google.maps.Marker({
                position: new google.maps.LatLng(PlaceLat, PlaceLon),
                map: map,
                title: PlaceTitle,
                clickable: false
            });
        }

    }
    -->
    </script>
    <asp:HiddenField ID="Latitude" runat="server" />
    <asp:HiddenField ID="Longitude" runat="server" />
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js%22%3E%3C/script>
    <script language="javascript" type="text/javascript">
        $(document).ready(function () {
            GetLocation();
            setupMapDiv();
            setupPlaceIveBeen();
        });
        function GetLocation() {
            if (navigator.geolocation != null) {
                navigator.geolocation.getCurrentPosition(getData);
            }
            else {
                var mess = document.getElementById('<%=Message.ClientID %>');
                mess.innerHTML = "Sorry, your browser does not support geolocation. " +
                    "Try the latest version of Safari on the iPhone, Android browser, or the latest version of FireFox.";
            }
        }
        function UpdateLocation_Click() {
            GetLocation();
        }
        function getData(position) {
            var latitude = position.coords.latitude;
            var longitude = position.coords.longitude;
            var hdLat = document.getElementById('<%=Latitude.ClientID %>');
            var hdLon = document.getElementById('<%=Longitude.ClientID %>');
            hdLat.value = latitude;
            hdLon.value = longitude;
        }
    </script>
    <asp:Label ID="Message" runat="server" />
    <asp:UpdatePanel ID="upl" runat="server">
        <ContentTemplate>
    <asp:Panel ID="pnlStart" runat="server" Visible="true">
    <div id="topbar">
        <div id="title">MapSplore</div>
    </div>
    <div id="content">
        <ul class="pageitem">
            <li class="menu">
                <asp:LinkButton ID="lbLocalDeals" runat="server" onclick="lbLocalDeals_Click">
                <asp:Image ID="imLocalDeals" runat="server" ImageUrl="~/Images/ArtFavor_Money_Bag_Icon.png" Height="30" />
                <span class="name">Local Deals.</span>
                <span class="arrow"></span>
                </asp:LinkButton>
                </li>
            <li class="menu">
                <asp:LinkButton ID="lbLocalPlaces" runat="server" onclick="lbLocalPlaces_Click">
                <asp:Image ID="imLocalPlaces" runat="server" ImageUrl="~/Images/Andy_Houses_on_the_horizon_-_Starburst_remix.png" Height="30" />
                <span class="name">Local Places.</span>
                <span class="arrow"></span>
                </asp:LinkButton>
                </li>
            <li class="menu">
                <asp:LinkButton ID="lbWhereIveBeen" runat="server" onclick="lbWhereIveBeen_Click">
                <asp:Image ID="imImHere" runat="server" ImageUrl="~/Images/ryanlerch_flagpole.png" Height="30" />
                <span class="name">I've been here.</span>
                <span class="arrow"></span>
                </asp:LinkButton>
                </li>
            <li class="menu">
                <asp:LinkButton ID="lbMyStats" runat="server">
                <asp:Image ID="imMyStats" runat="server" ImageUrl="~/Images/Anonymous_Spreadsheet.png" Height="30" />
                <span class="name">My Stats.</span>
                <span class="arrow"></span>
                </asp:LinkButton>
                </li>
            <li class="menu">
                <asp:LinkButton ID="lbAddAPlace" runat="server" onclick="lbAddAPlace_Click">
                <asp:Image ID="imAddAPlace" runat="server" ImageUrl="~/Images/jean_victor_balin_add.png" Height="30" />
                <span class="name">Add a Place.</span>
                <span class="arrow"></span>
                </asp:LinkButton>
                </li>
            <li class="button">
                <input type="button" value="Update Your Current Location" onclick="UpdateLocation_Click()">
                </li>
        </ul>
    </div>
    </asp:Panel>
    <div>
    <asp:Panel ID="pnlCoupons" runat="server" Visible="false">
        <div id="topbar">
        <div id="title">MapSplore</div>
        <div id="leftbutton">
            <asp:LinkButton runat="server" Text="Return"
                ID="ReturnFromDeals" OnClick="ReturnFromDeals_Click" /></div></div>
    <div class="content">
    <asp:ListView ID="lvCoupons" runat="server">
        <LayoutTemplate>
            <ul class="pageitem" runat="server">
                <asp:PlaceHolder ID="itemPlaceholder" runat="server" />
            </ul>
        </LayoutTemplate>
        <ItemTemplate>
            <li class="menu">
                <asp:LinkButton ID="lbBusiness" runat="server" Text='<%#Eval("Place.Name") %>' OnClick="lbBusiness_Click">
                    <span class="comment">
                    <asp:Label ID="lblAddress" runat="server" Text='<%#Eval("Place.Address1") %>' />
                    <asp:Label ID="lblDis" runat="server" Text='<%# Convert.ToString(Convert.ToInt32(Eval("Place.Distance"))) + " meters" %>' CssClass="smallText" />
                    <asp:HiddenField ID="hdPlaceId" runat="server" Value='<%#Eval("PlaceId") %>' />
                    <asp:HiddenField ID="hdGeoPromotionId" runat="server" Value='<%#Eval("GeoPromotionId") %>' />
                    </span>
                    <span class="arrow"></span>
                </asp:LinkButton></li></ItemTemplate></asp:ListView><asp:GridView ID="gvCoupons" runat="server" AutoGenerateColumns="false">
            <HeaderStyle BackColor="Silver" />
            <AlternatingRowStyle BackColor="Wheat" />
            <Columns>
                <asp:TemplateField AccessibleHeaderText="Business" HeaderText="Business">
                    <ItemTemplate>
                        <asp:Image ID="imPlaceType" runat="server" Text='<%#Eval("Type") %>' ImageUrl='<%#Eval("Image") %>' />
                        <asp:LinkButton ID="lbBusiness" runat="server" Text='<%#Eval("Name") %>' OnClick="lbBusiness_Click" />
                        <asp:LinkButton ID="lblAddress" runat="server" Text='<%#Eval("Address1") %>' CssClass="smallText" />
                        <asp:Label ID="lblDis" runat="server" Text='<%# Convert.ToString(Convert.ToInt32(Eval("Distance"))) + " meters" %>' CssClass="smallText" />
                        <asp:HiddenField ID="hdPlaceId" runat="server" Value='<%#Eval("PlaceId") %>' />
                        <asp:HiddenField ID="hdGeoPromotionId" runat="server" Value='<%#Eval("GeoPromotionId") %>' />
                        <asp:Label ID="lblInfo" runat="server" Visible="false" />
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>
    </div>
    </asp:Panel>
    <asp:Panel ID="pnlPlaces" runat="server" Visible="false">
    <div id="topbar">
        <div id="title">
            MapSplore</div><div id="leftbutton">
            <asp:LinkButton runat="server" Text="Return"
                ID="ReturnFromPlaces" OnClick="ReturnFromPlaces_Click" /></div></div>
        <div id="content">
        <asp:ListView ID="lvPlaces" runat="server">
            <LayoutTemplate>
                <ul id="ulPlaces" class="pageitem" runat="server">
                    <asp:PlaceHolder ID="itemPlaceholder" runat="server" />
                    <li class="menu">
                        <asp:LinkButton ID="lbNotListed" runat="server" CssClass="name"
                            OnClick="lbNotListed_Click">
                            Place not listed
                            <span class="arrow"></span>   
                        </asp:LinkButton>
                    </li>
                </ul>
            </LayoutTemplate>
            <ItemTemplate>
            <li class="menu">
                <asp:LinkButton ID="lbImHere" runat="server" CssClass="name"
                    OnClick="lbImHere_Click">
                <%#DisplayName(Eval("Name")) %>&nbsp;
                <%# Convert.ToString(Convert.ToInt32(Eval("Distance"))) + " meters" %>
                <asp:HiddenField ID="hdPlaceId" runat="server" Value='<%#Eval("PlaceId") %>' />
                <span class="arrow"></span>
                </asp:LinkButton></li></ItemTemplate></asp:ListView>
    </div>
    </asp:Panel>
    <asp:Panel ID="pnlImHereNow" runat="server" Visible="false">
        <div id="topbar">
        <div id="title">
            MapSplore</div><div id="leftbutton">
            <asp:LinkButton runat="server" Text="Places"
                ID="lbImHereNowReturn" OnClick="lbImHereNowReturn_Click" /></div></div>
            <div id="rightbutton">
            <asp:LinkButton runat="server" Text="Beginning"
                ID="lbBackToBeginning" OnClick="lbBackToBeginning_Click" />
            </div>
        <div id="content">
        <ul class="pageitem">
        <asp:HiddenField ID="hdPlaceId" runat="server" />
        <asp:HiddenField ID="hdPlaceLat" runat="server" />
        <asp:HiddenField ID="hdPlaceLon" runat="server" />
        <asp:HiddenField ID="hdPlaceTitle" runat="server" />
        <asp:Button ID="btnImHereNow" runat="server"
            Text="I'm here" OnClick="btnImHereNow_Click" />
            <asp:Label ID="lblPlaceTitle" runat="server" /><br />
        <asp:TextBox ID="txtWhatsHappening" runat="server" TextMode="MultiLine" Rows="2" style="width:300px" /><br />
        <div id="divImHere" style="width:300px; height:300px"></div>
        </div>
        </ul>
    </asp:Panel>
    <asp:Panel runat="server" ID="pnlIveBeenHere" Visible="false">
        <div id="topbar">
        <div id="title">
            Where I've been</div><div id="leftbutton">
            <asp:LinkButton ID="lbIveBeenHereBack" runat="server" Text="Back" OnClick="lbIveBeenHereBack_Click" /></div></div>
        <div id="content">
        <asp:ListView ID="lvWhereIveBeen" runat="server">
            <LayoutTemplate>
                <ul id="ulWhereIveBeen" class="pageitem" runat="server">
                    <asp:PlaceHolder ID="itemPlaceholder" runat="server" />
                </ul>
            </LayoutTemplate>
            <ItemTemplate>
            <li class="menu" runat="server">
                <asp:LinkButton ID="lbPlaceIveBeen" runat="server" OnClick="lbPlaceIveBeen_Click" CssClass="name">
                    <asp:Label ID="lblPlace" runat="server" Text='<%#Eval("PlaceName") %>' /> at
                    <asp:Label ID="lblTime" runat="server" Text='<%#Eval("ATTime") %>' CssClass="content" />
                    <asp:HiddenField ID="hdATID" runat="server" Value='<%#Eval("ATID") %>' />
                    <span class="arrow"></span>
                </asp:LinkButton>
            </li>
            </ItemTemplate>
        </asp:ListView>
        </div>
        </asp:Panel>
    <asp:Panel runat="server" ID="pnlPlaceIveBeen" Visible="false">
        <div id="topbar">
        <div id="title">
            I've been here
        </div>
        <div id="leftbutton">
            <asp:LinkButton ID="lbPlaceIveBeenBack" runat="server" Text="Back" OnClick="lbPlaceIveBeenBack_Click" />
        </div>
        <div id="rightbutton">
            <asp:LinkButton ID="lbPlaceIveBeenBeginning" runat="server" Text="Beginning" OnClick="lbPlaceIveBeenBeginning_Click" />
        </div>
        </div>
        <div id="content">
            <ul class="pageitem">
            <li>
            <asp:HiddenField ID="hdPlaceIveBeenPlaceId" runat="server" />
            <asp:HiddenField ID="hdPlaceIveBeenLatitude" runat="server" />
            <asp:HiddenField ID="hdPlaceIveBeenLongitude" runat="server" />
            <asp:Label ID="lblPlaceIveBeenName" runat="server" /><br />
            <asp:Label ID="lblPlaceIveBeenAddress" runat="server" /><br />
            <asp:Label ID="lblPlaceIveBeenCity" runat="server" />,
            <asp:Label ID="lblPlaceIveBeenState" runat="server" />
            <asp:Label ID="lblPlaceIveBeenZipCode" runat="server" /><br />
            <asp:Label ID="lblPlaceIveBeenCountry" runat="server" /><br />
            <div id="divPlaceIveBeen" style="width:300px; height:300px"></div>
            </li>
            </ul>
        </div>
           
    </asp:Panel>

        <asp:Panel ID="pnlAddPlace" runat="server" Visible="false">
                <div id="topbar">
<div id="title">MapSplore</div><div id="leftbutton">
<asp:LinkButton ID="lbAddPlaceReturn" runat="server" Text="Back" OnClick="lbAddPlaceReturn_Click" /></div><div id="rightnav">
</div>
</div>
<div id="content">
    <ul class="pageitem">
        <li id="liPlaceAddMessage" runat="server" visible="false">
        <asp:Label ID="PlaceAddMessage" runat="server" />
        </li>
        <li class="bigfield">
        <asp:TextBox ID="txtPlaceName" runat="server" placeholder="Name of Establishment" />
        </li>
        <li class="bigfield">
        <asp:TextBox ID="txtAddress1" runat="server" placeholder="Address 1" />
        </li>
        <li class="bigfield">
        <asp:TextBox ID="txtCity" runat="server" placeholder="City" />
        </li>
        <li class="select">
        <asp:DropDownList ID="ddlProvince" runat="server" placeholder="Select State" /> 
        <span class="arrow"></span>     
        </li>
        <li class="bigfield">
        <asp:TextBox ID="txtZipCode" runat="server" placeholder="Zip Code" />
        </li>
        <li class="select">
        <asp:DropDownList ID="ddlCountry" runat="server"
            onselectedindexchanged="ddlCountry_SelectedIndexChanged" />
        <span class="arrow"></span>
        </li>
        <li class="bigfield">
        <asp:TextBox ID="txtPhoneNumber" runat="server" placeholder="Phone Number" />
        </li>
        <li class="checkbox">
            <span class="name">You Here Now:</span> <asp:CheckBox ID="cbYouHereNow" runat="server" Checked="true" />
        </li>
        <li class="button">
        <asp:Button ID="btnAdd" runat="server" Text="Add Place"
            onclick="btnAdd_Click" />
        </li>
    </ul>
</div>
        </asp:Panel>
        <asp:Panel ID="pnlImHere" runat="server" Visible="false">
            <asp:TextBox ID="txtImHere" runat="server"
                TextMode="MultiLine" Rows="3" Columns="40" /><br />
            <asp:DropDownList ID="ddlPlace" runat="server" /><br />
            <asp:Button ID="btnHere" runat="server" Text="Tell Everyone I'm Here"
                onclick="btnHere_Click" /><br />
        </asp:Panel>

    </div>
    </ContentTemplate>
    </asp:UpdatePanel>

</asp:Content>

Code Behind .cs file:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using LocationDataModel;

public partial class AT_iPhone_Default : ViewStatePage
{
    private iPhoneDevice ipd;

    protected void Page_Load(object sender, EventArgs e)
    {
        LocationDataEntities lde = new LocationDataEntities();
        if (!Page.IsPostBack)
        {
            var Countries = from c in lde.Countries select c;
            foreach (Country co in Countries)
            {
                ddlCountry.Items.Add(new ListItem(co.Name, co.CountryId.ToString()));
            }
            ddlCountry_SelectedIndexChanged(ddlCountry, null);
            if (AppleIPhone.IsIPad())
                ipd = iPhoneDevice.iPad;
            if (AppleIPhone.IsIPhone())
                ipd = iPhoneDevice.iPhone;
            if (AppleIPhone.IsIPodTouch())
                ipd = iPhoneDevice.iPodTouch;
        }
    }
    protected void btnPlaces_Click(object sender, EventArgs e)
    {
    }
    protected void btnAdd_Click(object sender, EventArgs e)
    {
        bool blImHere = cbYouHereNow.Checked;
        string Place = txtPlaceName.Text,
            Address1 = txtAddress1.Text,
            City = txtCity.Text,
            ZipCode = txtZipCode.Text,
            PhoneNumber = txtPhoneNumber.Text,
            ProvinceId = ddlProvince.SelectedItem.Value,
            CountryId = ddlCountry.SelectedItem.Value;
        int iProvinceId, iCountryId;
        double dLatitude, dLongitude;
        DataAccess da = new DataAccess();
        if ((!String.IsNullOrEmpty(ProvinceId)) &&
            (!String.IsNullOrEmpty(CountryId)))
        {
            iProvinceId = Convert.ToInt32(ProvinceId);
            iCountryId = Convert.ToInt32(CountryId);
            if (blImHere)
            {
                dLatitude = Convert.ToDouble(Latitude.Value);
                dLongitude = Convert.ToDouble(Longitude.Value);
                da.StorePlace(Place, Address1, String.Empty, City,
                    iProvinceId, ZipCode, iCountryId, PhoneNumber,
                    dLatitude, dLongitude);
            }
            else
            {
                da.StorePlace(Place, Address1, String.Empty, City,
                    iProvinceId, ZipCode, iCountryId, PhoneNumber);
            }
            liPlaceAddMessage.Visible = true;
            PlaceAddMessage.Text = "Awesome, your place has been added. Add Another!";
            txtPlaceName.Text = String.Empty;
            txtAddress1.Text = String.Empty;
            txtCity.Text = String.Empty;
            ddlProvince.SelectedIndex = -1;
            txtZipCode.Text = String.Empty;
            txtPhoneNumber.Text = String.Empty;
        }
        else
        {
            liPlaceAddMessage.Visible = true;
            PlaceAddMessage.Text = "Please select a State and a Country.";
        }
    }
    protected void ddlCountry_SelectedIndexChanged(object sender, EventArgs e)
    {
        string CountryId = ddlCountry.SelectedItem.Value;
        if (!String.IsNullOrEmpty(CountryId))
        {
            int iCountryId = Convert.ToInt32(CountryId);
            LocationDataModel.LocationDataEntities lde = new LocationDataModel.LocationDataEntities();
            var prov = from p in lde.Provinces where p.CountryId == iCountryId
                       orderby p.ProvinceName select p;
           
            ddlProvince.Items.Add(String.Empty);
            foreach (Province pr in prov)
            {
                ddlProvince.Items.Add(new ListItem(pr.ProvinceName, pr.ProvinceId.ToString()));
            }
        }
        else
        {
            ddlProvince.Items.Clear();
        }
    }
    protected void btnImHere_Click(object sender, EventArgs e)
    {
        int i = 0;
        DataAccess da = new DataAccess();
        double Lat = Convert.ToDouble(Latitude.Value),
            Lon = Convert.ToDouble(Longitude.Value);
        List<Place> lp = da.NearByLocations(Lat, Lon);
        foreach (Place p in lp)
        {
            ListItem li = new ListItem(p.Name, p.PlaceId.ToString());
            if (i == 0)
            {
                li.Selected = true;
            }
            ddlPlace.Items.Add(li);
            i++;
        }
        pnlAddPlace.Visible = false;
        pnlImHere.Visible = true;
    }
    protected void lbImHere_Click(object sender, EventArgs e)
    {
        string UserName = Membership.GetUser().UserName;
        ListViewItem lvi = (ListViewItem)(((LinkButton)sender).Parent);
        HiddenField hd = (HiddenField)lvi.FindControl("hdPlaceId");
        long PlaceId = Convert.ToInt64(hd.Value);
        double dLatitude = Convert.ToDouble(Latitude.Value);
        double dLongitude = Convert.ToDouble(Longitude.Value);
        DataAccess da = new DataAccess();
        Place pl = da.GetPlace(PlaceId);
        pnlImHereNow.Visible = true;
        pnlPlaces.Visible = false;
        hdPlaceId.Value = PlaceId.ToString();
        hdPlaceLat.Value = pl.Latitude.ToString();
        hdPlaceLon.Value = pl.Longitude.ToString();
        hdPlaceTitle.Value = pl.Name;
        lblPlaceTitle.Text = pl.Name;
    }
    protected void btnHere_Click(object sender, EventArgs e)
    {
        string UserName = Membership.GetUser().UserName;
        string WhatsH = txtImHere.Text;
        long PlaceId = Convert.ToInt64(ddlPlace.SelectedValue);
        double dLatitude = Convert.ToDouble(Latitude.Value);
        double dLongitude = Convert.ToDouble(Longitude.Value);
        DataAccess da = new DataAccess();
        da.StoreUserAT(UserName, PlaceId, WhatsH,
            dLatitude, dLongitude);
    }
    protected void btnLocalCoupons_Click(object sender, EventArgs e)
    {
        double dLatitude = Convert.ToDouble(Latitude.Value);
        double dLongitude = Convert.ToDouble(Longitude.Value);
        DataAccess da = new DataAccess();

    }
    protected void lbBusiness_Click(object sender, EventArgs e)
    {
        string UserName = Membership.GetUser().UserName;
        GridViewRow gvr = (GridViewRow)(((LinkButton)sender).Parent.Parent);
        HiddenField hd = (HiddenField)gvr.FindControl("hdPlaceId");
        string sPlaceId = hd.Value;
        Int64 PlaceId;
        if (!String.IsNullOrEmpty(sPlaceId))
        {
            PlaceId = Convert.ToInt64(sPlaceId);
        }
    }
    protected void lbLocalDeals_Click(object sender, EventArgs e)
    {
        double dLatitude = Convert.ToDouble(Latitude.Value);
        double dLongitude = Convert.ToDouble(Longitude.Value);
        DataAccess da = new DataAccess();
        pnlCoupons.Visible = true;
        pnlStart.Visible = false;
        List<GeoPromotion> lgp = da.NearByDeals(dLatitude, dLongitude);
        lvCoupons.DataSource = lgp;
        lvCoupons.DataBind();
    }
    protected void lbLocalPlaces_Click(object sender, EventArgs e)
    {
        DataAccess da = new DataAccess();
        double Lat = Convert.ToDouble(Latitude.Value);
        double Lon = Convert.ToDouble(Longitude.Value);
        List<LocationDataModel.Place> places = da.NearByLocations(Lat, Lon);
        lvPlaces.DataSource = places;
        lvPlaces.SelectedIndex = -1;
        lvPlaces.DataBind();
        pnlPlaces.Visible = true;
        pnlStart.Visible = false;
    }
    protected void ReturnFromPlaces_Click(object sender, EventArgs e)
    {
        pnlPlaces.Visible = false;
        pnlStart.Visible = true;
    }
    protected void ReturnFromDeals_Click(object sender, EventArgs e)
    {
        pnlCoupons.Visible = false;
        pnlStart.Visible = true;
    }
    protected void btnImHereNow_Click(object sender, EventArgs e)
    {
        long PlaceId = Convert.ToInt32(hdPlaceId.Value);
        string UserName = Membership.GetUser().UserName;
        string WhatsHappening = txtWhatsHappening.Text;
        double UserLat = Convert.ToDouble(Latitude.Value);
        double UserLon = Convert.ToDouble(Longitude.Value);
        DataAccess da = new DataAccess();
        da.StoreUserAT(UserName, PlaceId, WhatsHappening,
            UserLat, UserLon);
    }
    protected void lbImHereNowReturn_Click(object sender, EventArgs e)
    {
        pnlImHereNow.Visible = false;
        pnlPlaces.Visible = true;
    }
    protected void lbBackToBeginning_Click(object sender, EventArgs e)
    {
        pnlStart.Visible = true;
        pnlImHereNow.Visible = false;
    }
    protected void lbWhereIveBeen_Click(object sender, EventArgs e)
    {
        string UserName = Membership.GetUser().UserName;
        pnlStart.Visible = false;
        pnlIveBeenHere.Visible = true;
        DataAccess da = new DataAccess();
        lvWhereIveBeen.DataSource = da.UserATs(UserName, 0, 15);
        lvWhereIveBeen.DataBind();
    }
    protected void lbIveBeenHereBack_Click(object sender, EventArgs e)
    {
        pnlIveBeenHere.Visible = false;
        pnlStart.Visible = true;
    }

    protected void lbPlaceIveBeen_Click(object sender, EventArgs e)
    {
        LinkButton lb = (LinkButton)sender;
        ListViewItem lvi = (ListViewItem)lb.Parent.Parent;
        HiddenField hdATID = (HiddenField)lvi.FindControl("hdATID");
        Int64 ATID = Convert.ToInt64(hdATID.Value);
        DataAccess da = new DataAccess();
        pnlIveBeenHere.Visible = false;
        pnlPlaceIveBeen.Visible = true;
        var plac = da.GetPlaceViaATID(ATID);
        hdPlaceIveBeenPlaceId.Value = plac.PlaceId.ToString();
        hdPlaceIveBeenLatitude.Value = plac.Latitude.ToString();
        hdPlaceIveBeenLongitude.Value = plac.Longitude.ToString();
        lblPlaceIveBeenName.Text = plac.Name;
        lblPlaceIveBeenAddress.Text = plac.Address1;
        lblPlaceIveBeenCity.Text = plac.City;
        lblPlaceIveBeenState.Text = plac.Province.ProvinceName;
        lblPlaceIveBeenZipCode.Text = plac.ZipCode;
        lblPlaceIveBeenCountry.Text = plac.Country.Name;
    }

    protected void lbNotListed_Click(object sender, EventArgs e)
    {
        SetupAddPoint();
        pnlPlaces.Visible = false;
    }

    protected void lbAddAPlace_Click(object sender, EventArgs e)
    {
        SetupAddPoint();
    }

    private void SetupAddPoint()
    {
        double lat = Convert.ToDouble(Latitude.Value);
        double lon = Convert.ToDouble(Longitude.Value);
        DataAccess da = new DataAccess();
        var zip = da.WhereAmIAt(lat, lon);
        if (zip.Count > 0)
        {
            var z0 = zip[0];
            txtCity.Text = z0.City;
            txtZipCode.Text = z0.ZipCode;
            ddlProvince.ClearSelection();
            if (z0.ProvinceId.HasValue == true)
            {
                foreach (ListItem li in ddlProvince.Items)
                {
                    if (li.Value == z0.ProvinceId.Value.ToString())
                    {
                        li.Selected = true;
                        break;
                    }
                }
            }
        }
        pnlAddPlace.Visible = true;
        pnlStart.Visible = false;
    }
    protected void lbAddPlaceReturn_Click(object sender, EventArgs e)
    {
        pnlAddPlace.Visible = false;
        pnlStart.Visible = true;
        liPlaceAddMessage.Visible = false;
        PlaceAddMessage.Text = String.Empty;
    }
    protected void lbPlaceIveBeenBack_Click(object sender, EventArgs e)
    {
        pnlIveBeenHere.Visible = true;
        pnlPlaceIveBeen.Visible = false;
       
    }
    protected void lbPlaceIveBeenBeginning_Click(object sender, EventArgs e)
    {
        pnlPlaceIveBeen.Visible = false;
        pnlStart.Visible = true;
    }
    protected string DisplayName(object val)
    {
        string strVal = Convert.ToString(val);

        if (AppleIPhone.IsIPad())
        {
            ipd = iPhoneDevice.iPad;
        }
        if (AppleIPhone.IsIPhone())
        {
            ipd = iPhoneDevice.iPhone;
        }
        if (AppleIPhone.IsIPodTouch())
        {
            ipd = iPhoneDevice.iPodTouch;
        }
        return (iPhoneHelper.DisplayContentOnMenu(strVal, ipd));
    }
}

iPhoneHelper.cs file:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

public enum iPhoneDevice
{
    iPhone, iPodTouch, iPad
}
/// <summary>
/// Summary description for iPhoneHelper
/// </summary>
///
public class iPhoneHelper
{
 public iPhoneHelper()
 {
  //
  // TODO: Add constructor logic here
  //
 }

// This code is stupid in retrospect. Use css to solve this problem 

    public static string DisplayContentOnMenu(string val, iPhoneDevice ipd)
    {
        string Return = val;
        string Elipsis = "...";
        int iPadMaxLength = 30;
        int iPhoneMaxLength = 15;
        if (ipd == iPhoneDevice.iPad)
        {
            if (Return.Length > iPadMaxLength)
            {
                Return = Return.Substring(0, iPadMaxLength - Elipsis.Length) + Elipsis;
            }
        }
        else
        {
            if (Return.Length > iPhoneMaxLength)
            {
                Return = Return.Substring(0, iPhoneMaxLength - Elipsis.Length) + Elipsis;
            }
        }
        return (Return);
    }

Source code for the ViewStatePage:

using System;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

/// <summary>
/// Summary description for BasePage
/// </summary>
#region Base class for a page.
public class ViewStatePage : System.Web.UI.Page
{

    PageStatePersisterToDatabase myPageStatePersister;
   
    public ViewStatePage()
        : base()
    {
        myPageStatePersister = new PageStatePersisterToDatabase(this);
    }

    protected override PageStatePersister PageStatePersister
    {
        get
        {
            return myPageStatePersister;
        }
    }

}
#endregion

#region This class will override the page persistence to store page state in a database.
public class PageStatePersisterToDatabase : PageStatePersister
{
    private string ViewStateKeyField = "__VIEWSTATE_KEY";
    private string _exNoConnectionStringFound = "No Database Configuration information is in the web.config.";

    public PageStatePersisterToDatabase(Page page)
        : base(page)
    {
    }

    public override void Load()
    {

        // Get the cache key from the web form data
        System.Int64 key = Convert.ToInt64(Page.Request.Params[ViewStateKeyField]);

        Pair state = this.LoadState(key);

        // Abort if cache object is not of type Pair
        if (state == null)
            throw new ApplicationException("Missing valid " + ViewStateKeyField);

        // Set view state and control state
        ViewState = state.First;
        ControlState = state.Second;
    }

    public override void Save()
    {

        // No processing needed if no states available
        if (ViewState == null && ControlState != null)
            return;

        System.Int64 key;
        IStateFormatter formatter = this.StateFormatter;
        Pair statePair = new Pair(ViewState, ControlState);

        // Serialize the statePair object to a string.
        string serializedState = formatter.Serialize(statePair);

        // Save the ViewState and get a unique identifier back.
        key = SaveState(serializedState);

        // Register hidden field to store cache key in
        // Page.ClientScript does not work properly with Atlas.
        //Page.ClientScript.RegisterHiddenField(ViewStateKeyField, key.ToString());
        ScriptManager.RegisterHiddenField(this.Page, ViewStateKeyField, key.ToString());
    }

    private System.Int64 SaveState(string PageState)
    {
        System.Int64 i64Key = 0;
        string strConn = String.Empty,
            strProvider = String.Empty;

        string strSql = "insert into tblPageState ( SerializedState ) values ( '" + SqlEscape(PageState) + "');select scope_identity();";
        SqlConnection sqlCn;
        SqlCommand sqlCm;
        try
        {
            GetDBConnectionString(ref strConn, ref strProvider);
            sqlCn = new SqlConnection(strConn);
            sqlCm = new SqlCommand(strSql, sqlCn);
            sqlCn.Open();
            i64Key = Convert.ToInt64(sqlCm.ExecuteScalar());
            if (sqlCn.State != ConnectionState.Closed)
            {
                sqlCn.Close();
            }
            sqlCn.Dispose();
            sqlCm.Dispose();
        }
        finally
        {
            sqlCn = null;
            sqlCm = null;
        }
        return i64Key;
    }

    private Pair LoadState(System.Int64 iKey)
    {
        string strConn = String.Empty,
            strProvider = String.Empty,
            SerializedState = String.Empty,
            strMinutesInPast = GetMinutesInPastToDelete();
        Pair PageState;
        string strSql = "select SerializedState from tblPageState where tblPageStateID=" + iKey.ToString() + ";" +
            "delete from tblPageState where DateUpdated<DateAdd(mi, " + strMinutesInPast + ", getdate());";
        SqlConnection sqlCn;
        SqlCommand sqlCm;
        try
        {
            GetDBConnectionString(ref strConn, ref strProvider);
            sqlCn = new SqlConnection(strConn);
            sqlCm = new SqlCommand(strSql, sqlCn);

            sqlCn.Open();
            SerializedState = Convert.ToString(sqlCm.ExecuteScalar());
            IStateFormatter formatter = this.StateFormatter;

            if ((null == SerializedState) ||
                (String.Empty == SerializedState))
            {
                throw (new ApplicationException("No ViewState records were returned."));
            }

            // Deserilize returns the Pair object that is serialized in
            // the Save method.
            PageState = (Pair)formatter.Deserialize(SerializedState);

            if (sqlCn.State != ConnectionState.Closed)
            {
                sqlCn.Close();
            }
            sqlCn.Dispose();
            sqlCm.Dispose();
        }
        finally
        {
            sqlCn = null;
            sqlCm = null;
        }
        return PageState;
    }

    private string SqlEscape(string Val)
    {
        string ReturnVal = String.Empty;
        if (null != Val)
        {
            ReturnVal = Val.Replace("'", "''");
        }
        return (ReturnVal);
    }
    private void GetDBConnectionString(ref string ConnectionStringValue, ref string ProviderNameValue)
    {
        if (System.Configuration.ConfigurationManager.ConnectionStrings.Count > 0)
        {
            ConnectionStringValue = System.Configuration.ConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString;
            ProviderNameValue = System.Configuration.ConfigurationManager.ConnectionStrings["ApplicationServices"].ProviderName;
        }
        else
        {
            throw new ConfigurationErrorsException(_exNoConnectionStringFound);
        }
    }
    private string GetMinutesInPastToDelete()
    {
        string strReturn = "-60";
        if (null != System.Configuration.ConfigurationManager.AppSettings["MinutesInPastToDeletePageState"])
        {
            strReturn = System.Configuration.ConfigurationManager.AppSettings["MinutesInPastToDeletePageState"].ToString();
        }
        return (strReturn);
    }
}
#endregion

AppleiPhone.cs file:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

/// <summary>
/// Summary description for AppleIPhone
/// </summary>
public class AppleIPhone
{
 public AppleIPhone()
 {
  //
  // TODO: Add constructor logic here
  //
 }

    static public bool IsIPhoneOS()
    {
        return (IsIPad() || IsIPhone() || IsIPodTouch());
    }

    static public bool IsIPhone()
    {
        return IsTest("iPhone");
    }

    static public bool IsIPodTouch()
    {
        return IsTest("iPod");
    }

    static public bool IsIPad()
    {
        return IsTest("iPad");
    }

    static private bool IsTest(string Agent)
    {
        bool bl = false;
        string ua = HttpContext.Current.Request.UserAgent.ToLower();
        try
        {
            bl = ua.Contains(Agent.ToLower());
        }
        catch { }
        return (bl);
   
    }
}

Master page .cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;

public partial class MasterPages_iPhoneMaster : System.Web.UI.MasterPage
{
    protected void Page_Load(object sender, EventArgs e)
    {
            HtmlHead head = Page.Header;
            HtmlMeta meta = new HtmlMeta();
            if (AppleIPhone.IsIPad() == true)
            {
                meta.Content = "width=400,user-scalable=no";
                head.Controls.Add(meta);
            }
            else
            {
                meta.Content = "width=device-width, user-scalable=no";
                meta.Attributes.Add("name", "viewport");
            }
            meta.Attributes.Add("name", "viewport");
            head.Controls.Add(meta);
            HtmlLink cssLink = new HtmlLink();
            HtmlGenericControl script = new HtmlGenericControl("script");
            script.Attributes.Add("type", "text/javascript");
            script.Attributes.Add("src", ResolveUrl("~/Scripts/iWebKit/javascript/functions.js"));
            head.Controls.Add(script);
            cssLink.Attributes.Add("rel", "stylesheet");
            cssLink.Attributes.Add("href", ResolveUrl("~/Scripts/iWebKit/css/style.css") );
            cssLink.Attributes.Add("type", "text/css");
            head.Controls.Add(cssLink);
            HtmlGenericControl jsLink = new HtmlGenericControl("script");
            //jsLink.Attributes.Add("type", "text/javascript");
            //jsLink.Attributes.Add("src", ResolveUrl("~/Scripts/jquery-1.4.1.min.js") );
            //head.Controls.Add(jsLink);
            HtmlLink appleIcon = new HtmlLink();
            appleIcon.Attributes.Add("rel", "apple-touch-icon");
            appleIcon.Attributes.Add("href", ResolveUrl("~/apple-touch-icon.png"));
            HtmlMeta appleMobileWebAppStatusBarStyle = new HtmlMeta();
            appleMobileWebAppStatusBarStyle.Attributes.Add("name", "apple-mobile-web-app-status-bar-style");
            appleMobileWebAppStatusBarStyle.Attributes.Add("content", "black");
            head.Controls.Add(appleMobileWebAppStatusBarStyle);
    }

    internal string FindPath(string Location)
    {
        string Url = Server.MapPath(Location);
        return (Url);
    }
}

No Comments