在XAF(ASP.NET)中以ListEditor的形式调用百度地图API
因为项目需要,在系统中使用地图显示设备的地理位置。考虑过ArgGIS,Bing和Baidu地图。本来想用ArgGIS,看教程嫌麻烦。所以还是用Web地图吧。Bing的话还要申请个key,没心情。百度地图刚好有人申请了,所以我用Baidu地图。毫无逻辑的根据。权且当练手。貌似Bing地图更好点,后面会具体权衡下的。废话不多说。
做了一个下午,参考了以下几个很有用的网站:
1.How to use Google Maps inXAF ASP.NET application https://www.devexpress.com/Support/Center/Question/Details/T195734
基本上照着这个教程,就可以实现目的了。思路很清晰,而且带下载附件。非常赞的一个指导帖子。
2.How to :Implement an ASP.NET Web List Editor Using a Custom Control
https://documentation.devexpress.com/#eXpressAppFramework/CustomDocument113126
指导如何添加自定义的WebListEditor,官方教程。
3.https://www.devexpress.com/Support/Center/Question/Details/T181324
这个帖子提的问题可以仔细考虑下
4.当然是百度地图API的官网
http://developer.baidu.com/map/
接下来介绍下我本人的实现过程:
首先,当然是实现公共接口,供自定义的ListEditor调用。代码如下:
//封装坐标
public interface IMapLatLng
{
double Latitude { get; }
double Longitude { get; }
}
//自定义ListEditor需要的参数
public interface IMapMaker
{
IMapLatLng Position { get; }
string ID { get; }
}
接口定义好了,这时候我们可以先设置一个类,继承该IMapMaker接口,以供显示作用,这里,将该类命名为CustomAddress。
//自定义一个地址类
[DefaultClassOptions,DefaultProperty("ID")]
public class CustomAddress:BaseObject,IMapMaker
{
public CustomAddress(Session session) : base(session) { }
public IMapLatLng Position
{
get { return new MapLatLng(){ Latitude=this.Latitude,Longitude=this.Longitude} ; }
} public string ID{get;set;}
public double Latitude { get; set; }
public double Longitude { get; set; }
} //封装坐标
public class MapLatLng:IMapLatLng
{
public double Latitude
{
get;
set;
} public double Longitude
{
get;
set;
}
}
前期铺垫完毕,下面就进入具体的ListEditor的设置。上代码。
[ListEditor(typeof(IMapMaker),true)]
public class MapListEditor:ListEditor
{
public MapListEditor(IModelListView listView) : base(listView) { } protected override void AssignDataSourceToControl(object dataSource)
{
WebWindow.CurrentRequestWindow.RegisterClientScript(Model.Id + "_markers_script", ConvertToJS(Enumerable.Cast<IMapMaker>((IEnumerable)dataSource)), true);
} public static string ConvertToJS(IMapMaker maker)
{
List<IMapMaker> makers = new List<IMapMaker>();
if (maker != null)
makers.Add(maker);
return ConvertToJS(makers);
} public static string ConvertToJS(IEnumerable<IMapMaker> makers)
{
string makersScript = "var markers=[";
if (makers != null)
{
foreach (IMapMaker maker in makers)
{
string title=(maker.ID==null)?"":maker.ID.Replace("'","\\'");
makersScript+=string.Format(@"{{title: '{0}',latitude:{1},longitude:{2} }},",title,maker.Position.Latitude,maker.Position.Longitude);
}
}
makersScript=makersScript.TrimEnd(',');
makersScript+="];";
return makersScript;
} public override DevExpress.ExpressApp.Templates.IContextMenuTemplate ContextMenuTemplate
{
get { return null; }
} protected override object CreateControlsCore()
{
return CreateMapControl();
} public override bool AllowEdit
{
get
{
return false;
}
set { }
} public static WebControl CreateMapControl()
{
Panel ctrl = new Panel();
ctrl.ID = "map-canvas";
ctrl.Height = new Unit();
ctrl.Width = new Unit();
ASPxPanel geoMapControlPanel = new ASPxPanel();
geoMapControlPanel.ID = "MapPanel";
geoMapControlPanel.Height = new Unit();
geoMapControlPanel.Width = new Unit();
geoMapControlPanel.RightToLeft = DevExpress.Utils.DefaultBoolean.True;
geoMapControlPanel.Controls.Add(ctrl); geoMapControlPanel.Load += delegate(object sender, EventArgs e)
{
geoMapControlPanel.ClientSideEvents.Init = @"
function ShowMap() {
var map=new BMap.Map(document.getElementById('"+ctrl.ClientID+ @"'));
map.addControl(new BMap.NavigationControl());
map.addControl(new BMap.ScaleControl());
map.addControl(new BMap.OverviewMapControl());
map.centerAndZoom(new BMap.Point(116.404,23.915),11);
map.enableScrollWheelZoom(true);
if (typeof markers === 'undefined') {
}
else {
for (i = 0; i < markers.length; i++) {
var data = markers[i];
var point=new BMap.Point(data.latitude,data.longitude);
var icon=new BMap.Icon('pin.png',new BMap.Size(20,32),{anchor:new BMap.Size(10,30)});
var mkr=new BMap.Marker(point,{icon:icon});
map.addOverlay(mkr);
}
}
}";
};
return geoMapControlPanel;
}
public override System.Collections.IList GetSelectedObjects()
{
return new object[];
} public override DevExpress.ExpressApp.SelectionType SelectionType
{
get { return DevExpress.ExpressApp.SelectionType.None; }
}
}
因为之前没接触过在XAF中调用JavaScripts的知识,所以这段程序中,对我而言,对这方面的知识更感兴趣。但在这里不是重点。后面会单独写一章,介绍在XAF中调用JavaScripts的,这里mark以下。
最后,还有一个最重要的一点,就是在default.aspx中调用百度地图的API。
<head runat="server">
<title>Main Page</title>
<meta http-equiv="Expires" content="0" />
<script type="text/javascript" src="http://api.map.baidu.com/api?v=1.5&ak=[yourKey]"></script>
</head>
生成界面如下:

另外,讲下设计过程中,由于html和javascripts知识不牢固。犯了几点错误:
1.在开始写script元素的时候,没写结束标签:<script ... />。因为用的是chrome浏览器,它不支持这种写法,导致界面不显示任何内容。
2.改好这个错误后,发现界面可以显示其它内容,就是不显示地图。于是我是直接读页面的html和javascripts。发现竟然就是Bmap()这个构造函数少了个括号= =!
这里再强调下,xaf 写出的界面跟单纯用asp.net写其实差别不大,生成的页面就是一个单纯的html页面,如果出现显示问题,不妨直接读读html,更直观。
在XAF(ASP.NET)中以ListEditor的形式调用百度地图API的更多相关文章
- 如何在网页中调用百度地图api
我想在木有提供地图接口的年代,前端工程师门要么只写上企业的具体地址,要么就是用一张标有自己位置的地图图片.但是现在不一样啦!为了增强用户体验,谷歌,甚至百度都很开放了,你可以在他们的网站上找到地图接口 ...
- 关于调用百度地图api在自己写的网页中实现和解决在https中正常显示
百度地图开发者:http://lbsyun.baidu.com/index.php?title=jspopular 我们打开百度地图开发者网站,注册一个百度账号,然后打开控制台,开始创建应用:(如果你 ...
- ASP.NET中调用百度地图API
1.打开链接http://developer.baidu.com/map/jshome.htm这里有很多DEMO,或者你直接百度搜索“百度地图API”,第一个就是.进入后有很多方向供你选择,由于现在开 ...
- html5中高德、腾讯、百度 地图api调起手机app
html 部分 <div id="mapBg"> <div class="mapTab"> <a href="" ...
- 利用百度地图API,在浏览器中找到自己的位置
首先你得有个百度地图的秘钥,http://lbsyun.baidu.com/apiconsole/key 剩下的就是编码了 这里面会用到一个javascript里的一个函数,getMyLocation ...
- 【ASP.NET 进阶】根据IP地址进行百度地图定位
昨天有完成一个[ASP.NET 进阶]根据IP返回对应位置信息 的小Demo,既然可以通过IP获得位置信息,那当然可以通过位置信息的经纬度获取IP的当前定位了,虽然与实际地址偏移较大,毕竟不是GPRS ...
- Android中调用百度地图
一.调用百度地图 --第一种方法 1.下载百度地图SDK SDK可以拆分下载,需要使用那一部分功能就下载相应包含的SDK,如下图 核心的的jar 和so包,放在工程中的libs目录下 2.申请key ...
- Android应用中使用百度地图API并加入标注(一)
网上一些资料这样的的内容已经过时了,这里是最新的内容,假设哪里不正确,请吐槽... 1)下载百度地图移动版API(Android)开发包 要在Android应用中使用百度地图API,就须要 ...
- 如何在网中使用百度地图API自定义个性化地图
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
随机推荐
- 计算机网络——TCP三次、四次握手详解
三次握手:建立TCP连接 连接建立过程: B的TCP服务器进程先创建传输控制块TCB(存储了每一个连接中的一些重要信息,如:TCP连接表,到发送和接收缓存的指针,到重传队列的指针,当前的发送和接收序号 ...
- PhoneGap与Jquery Mobile结合开发android应用配置
由于工作需要,用到phonegap与jquery moblie搭配,开发android应用程序. 这些技术自己之前也都没接触过,可以说是压根没听说过,真是感慨,在开发领域,技术日新月异,知识真是永远学 ...
- 线上redis服务内存异常分析。
项目中,新增了一个统计功能,用来统计不同手机型号的每天访问pv,看了下redis2.6有个setbit的功能,于是打算尝尝鲜把 redis从2.4更新到了2.6 因为是租了vps.服务器的内存只有4g ...
- linux_2015_0827_linux中一些常用词的发音and…
linux相关 Unix: [ ju:niks ] 发音 (yew-nicks) 尤里克斯 GNU [ gəˈnju: ] 发音 (guh-noo) 葛扭 Linux: [ 'li:nэks ] 里那 ...
- bzoj3064 CPU监控
今天终于写了一道正常的题 思路是这样的: 1.普通线段树add,set不变,并改为下放标记版本 2.past_addv 记录一个区间内可能的addv值的最大值 3.past_setv 记录一个区间被s ...
- Code-first示例
首先创建一个空数据库 在vs2013中添加数据库类,按提示操作一直下一步 添加完以后,数据库类的代码 namespace mvctest.Models { using System; using ...
- 文本框的onchange事件,如何兼容各大浏览器
在项目中经常会遇到对用户输入的数据进行实时校验,而不是等文本框失去焦点或用户手动点击校验. 首先分析下在哪些情况下文本框会产生change事件. 1.用户通过键盘入正常字符时: 2.用户通过键盘输入非 ...
- 转自 处理老版PIL 到 pillow
帮新同事部署开发环境, 由于项目代码里用到了PIL库处理图片, 导致一些图片在浏览器中无法正常显示. 几番折腾, 解决了问题, 这里记录一下报的问题, 及解决方法: 1. python版本不对, 6 ...
- 第二百零三天 how can I 坚持
空虚的有点害怕. 日复一日. 今天做了什么?下班看了个搞笑段子. 上班和刘松聊了一下午,东扯西扯的. 下班玩了两局dota. 想租车去出去玩玩,确实没有什么想去的地方了. 莫巧菲. 哎,未来好可怕啊. ...
- netdata linux环境下的安装
据说netdata监控很个性化,采用的显示方式也很漂亮,就来尝试安装.百度搜索到的安装教程的斑斑是1.0.顺藤摸瓜去wiki看了看,已经更新为1.4了,果断走起: 下载地址::https://gith ...