Wind-Eagle

No pain,no gain!
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

最近想搞两个基于Google Map的网站玩玩,觉得直接操作Google Map API实在麻烦,于是就想用C#写一个封装Google Map API的GoogleMap Web服务器控件,这样,用ASP.NET创建基于Google Map的网站就非常简单啦!

下面就让我们从头开始吧!

一. 首先打开Visual Studio 2008(其他IDE也可以),创建一个C#类库项目,命名为WindEagle.GoogleMap,勾选"创建解决方案目录"选项.

二. 删除默认的Class1.cs,修改项目属性,设置默认命名空间为"WindEagle.Web.UI.Controls".

打开AssemblyInfo.cs,作如下修改:

    using System.Reflection;

    [assembly: AssemblyTitle(
"WindEagle.GoogleMap")]
    [assembly: AssemblyDescription(
"封装Google Map API的GoogleMap ASP.NET Web服务器控件")]
    [assembly: AssemblyCompany(
"WindEagle")]
    [assembly: AssemblyProduct(
"WindEagle.GoogleMap")]
    [assembly: AssemblyCopyright(
"Copyright © WindEagle 2008")]

    [assembly: AssemblyVersion(
"2.0.0.0")]
    [assembly: AssemblyFileVersion(
"2.0.0.0")]

三. 在项目中添加一个ASP.NET Server Control,命名为GoogleMap.cs.

导入如下命名空间:

using System;
using System.ComponentModel;
using System.Security.Permissions;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Collections;
using System.Drawing.Design;


我们初步设计的GoogleMap控件应该有以下这些属性:

1. Height和Width, 因为Google Map的大小不能为零,且高宽比例一定,所以我决定重写继承于WebControl的Height和Width属性.

        private static readonly Unit DefaultWidth = new Unit("1200px");
        
private static readonly Unit DefaultHeight = new Unit("960px");

        
public override Unit Height
        
{
            
get
            
{
                
return (base.Height != Unit.Empty) ? base.Height : DefaultHeight;
            }

            
set
            
{
                
base.Height = value;
            }

        }


        
public override Unit Width
        
{
            
get
            
{
                
return (base.Width != Unit.Empty) ? base.Width : DefaultWidth;
            }

            
set
            
{
                
base.Width = value;
            }

        }


2. Zoom, Google Map的固有属性,表示Map的显示等级.

        [
        Bindable(
true),
        Category(
"Google"),
        DefaultValue(
0),
        Description(
"The zoom.")
        ]
        
public virtual int Zoom
        
{
            
get
            
{
                
object zoom = ViewState["Zoom"];
                
return (zoom == null? 0 : (int)price;
            }

            
set
            
{
                ViewState[
"Zoom"= value;
            }

        }


3. Latitude和Longitude, Google Map的固有属性,表示Map中心点的纬度和经度.

        [
        Bindable(
true),
        Category(
"Google"),
        DefaultValue(
0),
        Description(
"The latitude.")
        ]
        
public virtual double Latitude
        
{
            
get
            
{
                
object latitude = ViewState["Latitude"];
                
return (latitude == null? 0 : (double)latitude;
            }

            
set
            
{
                ViewState[
"Latitude"= value;
            }

        }


        [
        Bindable(
true),
        Category(
"Google"),
        DefaultValue(
0),
        Description(
"The longitude.")
        ]
        
public virtual double Longitude
        
{
            
get
            
{
                
object longitude = ViewState["Longitude"];
                
return (longitude == null? 0 : (double)longitude;
            }

            
set
            
{
                ViewState[
"Longitude"= value;
            }

        }


4. Address, 当没有指定Latitude和Longitude的时候,自动根据本属性查询得到Latitude和Longitude的值.

        [
        Bindable(
true),
        Category(
"Google"),
        DefaultValue(
""),
        Description(
"The address."),
        Localizable(
true)
        ]
        
public virtual string Address
        
{
            
get
            
{
                String s 
= (String)ViewState["Address"];
                
return (s == null? String.Empty : s;
            }

            
set
            
{
                ViewState[
"Address"= value;
            }

        }


5. Key, 从Google那里得到的用户key.

        [
        Bindable(
true),
        Category(
"Google"),
        DefaultValue(
""),
        Description(
"The user key obtained from google map api.")
        ]
        
public virtual string Key
        
{
            
get
            
{
                String s 
= (String)ViewState["Key"];
                
return (s == null? String.Empty : s;
            }

            
set
            
{
                ViewState[
"Key"= value;
            }

        }


6. TagKey, 重写的只读TagKey属性,将Map的Tag从默认的HtmlTextWriterTag.Span改为HtmlTextWriterTag.Div.

        protected override HtmlTextWriterTag TagKey
        
{
            
get
            
{
                
return HtmlTextWriterTag.Div;
            }

        }


四. 給GoogleMap控件添加设计器
,参考演练:为 Web 服务器控件创建基本控件设计器,设计器的源代码为:

using System.Web.UI.Design;

namespace WindEagle.Web.UI.Controls
{
    
/// <summary>
    
/// GoogleMap Designer
    
/// </summary>

    public class GoogleMapDesigner : ControlDesigner
    
{
        
Properties        //////////////////////////////////////////////////////

        
Methods           ///////////////////////////////////////////////////////
    }

}


五. 修改GoogleMap的声明为:

    [AspNetHostingPermission(SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
    [ToolboxData(
"<{0}:GoogleMap runat=\"server\"></{0}:GoogleMap>")]
    [Designer(
typeof(GoogleMapDesigner))]
    
public class GoogleMap : WebControl


好了,下一篇文章中我将给GoogleMap类添加更多实用的属性.