在ASP.net MVC2中创建动态javascript的正确方法是什么?

时间:2010-05-09 09:01:28

标签: javascript jquery asp.net-mvc google-maps asp.net-mvc-2

我正在项目中创建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文件是对的吗?

有更好的方法吗?

5 个答案:

答案 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)。也许它可以帮助你创建一个包装你想要的功能的帮助器。