我正在项目中创建Google地图部分视图/用户控件,该控件传递包含纬度和经度值的强类型对象列表。
目前,这是我对partial的代码:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<Project.Models.Entities.Location>>" %>
<!-- Place for google to put the map -->
<div id="report_map_canvas" style="width: 100%; height: 728px; margin-bottom: 2px;">
</div>
<script type='text/javascript'>
google.load("maps", "2");
$(document).ready(initializeMap);
function initializeMap() {
if (GBrowserIsCompatible()) {
var map = new GMap2(document.getElementById('report_map_canvas'));
map.setCenter(new GLatLng(51.5, -0.1167), 2);
<% foreach (var item in Model) { %>
map.addOverlay(new GMarker(new GLatLng('<%= Html.Encode(item.latitude)%>','<%= Html.Encode(item.longitude)%>'),{ title: '<%= Html.Encode(String.Format("{0:F}",item.speed)) %> km/h '}));
<% } %>
map.setUIToDefault();
}
}
</script>
通过循环遍历列表并发出javascript,以这种方式动态创建javascript文件是对的吗?
有更好的方法吗?
答案 0 :(得分:1)
我不喜欢这种方式,因为如果您要添加许多项目,您将为用户加载一个大文档。相反,我更喜欢将项目加载为JSON,然后迭代它们并使用谷歌功能,例如:
var data = [<%="{x:50.44444,y:30.44444,speed:50},..." %>] // generate you JSON Here as array
for(var i = 0; i < data.length; i++){
map.addOverlay(new GMarker(new GLatLng(data[i].y,data[i].x),{ title: data[i].speed + 'Km/h'}));
}
所以你不会重复这部分
map.addOverlay(new GMarker(new GLatLng(,),{ title: + 'Km/h'}));
这将增加文档大小和页面加载
答案 1 :(得分:1)
它和它一样漂亮。
IMO做这样的事情会稍微好一些:
var locations = <%= Html.ToJson(Model) %>
在顶部,然后你的JavaScript将是纯JavaScript而没有嵌入C#的东西。
PS:您需要使用HtmlHelper
方法扩展ToJson
才能执行此操作。
答案 2 :(得分:1)
最终混合了Kronass和mookid的答案。
以下是最终参考代码:
public static class MvcViewExtensions
{
public static string ToJson(this System.Web.Mvc.HtmlHelper helper, object obj) {
JavaScriptSerializer serializer = new JavaScriptSerializer();
return serializer.Serialize(obj);
}
}
视图中的javascript:
<script type='text/javascript'>
google.load("maps", "2");
$(document).ready(initializeReportMap);
function initializeReportMap() {
if (GBrowserIsCompatible()) {
// Convert the reports to JSON
var reports = <%= Html.ToJson(Model) %>
var map = new GMap2(document.getElementById('report_map_canvas'));
map.setCenter(new GLatLng(51.5, -0.1167), 3);
for(var i = 0; i < reports.length; i++){
map.addOverlay(new GMarker(new GLatLng(reports[i].latitude,reports[i].longitude),{ title: reports[i].speed + 'Km/h'}));
}
map.setUIToDefault();
}
}
</script>
答案 3 :(得分:0)
使用页面呈现预加载数据没有任何问题(这有效地是你在循环中做的,也许你可以在你的页面中输出json并写一些javascript来评估它(这会减少repedative) charaters即map.addOverlay ...) 你只需要从你的模型中寻找无约束的输出,你不希望以这种方式渲染1 000 000条记录
答案 4 :(得分:0)
看看这个项目(Google map control for aspnet mvc)。也许它可以帮助你创建一个包装你想要的功能的帮助器。