【问题标题】:How to pass ASP.NET Repeater items to JavaScript array?如何将 ASP.NET 中继器项传递给 JavaScript 数组?
【发布时间】:2015-06-23 04:48:01
【问题描述】:

在我的 aspx 页面上,我有一个中继器控件,它显示数据库中位置的纬度。我想将从中继器返回的值传递到 java 脚本中,该脚本在 sql server 数据库的谷歌地图上显示位置标记。

 <form id="form1" runat="server">

    <script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=false"></script>

    <script type="text/javascript">
        var markers = [
        <asp:Repeater ID="rptMarkers" runat="server">
        <ItemTemplate>
                 {
                "title": '<%# Eval("City") %>',
                 "lat": '<%# Eval("Latitude") %>',
                 "lng": '<%# Eval("Longitude") %>',

             }
    </ItemTemplate>
    <SeparatorTemplate>
        ,
    </SeparatorTemplate>
    </asp:Repeater>
    ];
    </script>
   </form>

这是我的代码,

 void GetData(string strRsult)
{
    XmlDataDocument xmlDataDoc = new XmlDataDocument();
    xmlDataDoc.LoadXml(strRsult);
    foreach (XmlNode n in xmlDataDoc.DocumentElement.GetElementsByTagName("Property"))
    {
        if (n.HasChildNodes)
        {
          List<Markers> markers = new List<Markers>();
            foreach (XmlNode childNode in n)
            {
                if (childNode.Name=="GEOData")
                {
                    markers.Add(new Markers
                    {
                        City = childNode.Attributes["City"].Value,
                        Longitude = childNode.Attributes["Longitude"].Value,
                        Latitude = childNode.Attributes["Latitude"].Value
                    });
                }

            }
            rptMarkers.DataSource = markers;
            rptMarkers.DataBind();
        }

    }

【问题讨论】:

  • 无需从转发器读取,只需从转发器数据源创建一个json对象并将其传递给markers
  • @DGibbs 我如何创建一个 json 对象
  • 类似这样的东西:var jsonString = new JavaScriptSerializer().Serialize(dataSource);.
  • 我正在更新我想要查看的代码。

标签: javascript c# asp.net google-maps


【解决方案1】:

代码背后

//Retrieves markers from somewhere and converts them to a JSON string
public string GetMarkersJson()
{
    List<Marker> markers = GetData("string");
    return JsonConvert.SerializeObject(markers); //using JSON.NET for serialization
}

//Parses an XML string and retrieves a list of Marker objects. Should probably go in a utility class somewhere, not in code behind
List<Marker> GetData(string strRsult)
{
    List<Marker> markers = new List<Marker>();
    XmlDataDocument xmlDataDoc = new XmlDataDocument();
    xmlDataDoc.LoadXml(strRsult);
    foreach (XmlNode n in xmlDataDoc.DocumentElement.GetElementsByTagName("Property"))
    {
        if (n.HasChildNodes)
        {
            foreach (XmlNode childNode in n)
                {
                    if (childNode.Name=="GEOData")
                    {
                        markers.Add(new Marker
                        {
                            City = childNode.Attributes["City"].Value,
                            Longitude = childNode.Attributes["Longitude"].Value,
                            Latitude = childNode.Attributes["Latitude"].Value
                        });
                    }
                }
            }
    return markers;
}

型号

//Represents the data needed for each marker, with JSON.NET attributes to account for different property names we want to use in the JSON
public class Marker
{
    [JsonProperty(PropertyName = "title")]
    public string City {get; set;}

    [JsonProperty(PropertyName = "lat")]
    public string Latitude {get; set;}

    [JsonProperty(PropertyName = "lng")]
    public string Longitude {get; set;}
}

页面

//Embed the JSON into the page and have JavaScript parse it
var markers = JSON.parse('<%= GetMarkersJson() %>');

【讨论】:

  • @ahmeaad 我看到了你的更新。您可以更改 GetData 以返回标记对象列表(而不是绑定到中继器)并在我的示例中使用它来代替 Database.GetMarkers();。顺便说一句,您应该将您的类从Markers 重命名为Marker,因为该类的一个实例应该只代表一个标记。该列表将使其成为复数。
  • 我如何定义 json 属性它给了我语法错误。
  • @ahmeaad 当您遇到错误时,请准确告诉我们它是什么,这样我们就不必猜测了。我假设您收到一条错误消息,指出找不到类型 JsonProperty,这意味着您缺少 using 语句。一个简单的问题,您可以通过右键单击错误并转到 Resolve 来为您修复它,具体取决于您使用的 VS 版本。
  • 对不起,是的,错误 JsonProperty 找不到 [JsonProperty(PropertyName = "title")] 这个和其他属性
  • @ahmeaad 您是否尝试了右键单击和解决功能,该功能会自动添加必要的using 语句?您的项目中是否正确引用了 Json.NET?
【解决方案2】:

你的 aspx 代码

<form id="form1" runat="server">
<script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=false"></script>

<asp:literal runat="server" id="Literal1"></asp:literal>
</form>

你的 aspx.cs 代码

    //Parses an XML string and retrieves a list of Marker objects. Should probably go in a utility class somewhere, not in code behind
    protected void GetData(string strRsult)
    {
        List<Marker> markers = new List<Marker>();
        XmlDataDocument xmlDataDoc = new XmlDataDocument();
        xmlDataDoc.LoadXml(strRsult);
        //This line write script init in your html page
        Literal1.text = "<script type=\"text/javascript\">var markers = [";

        foreach (XmlNode n in xmlDataDoc.DocumentElement.GetElementsByTagName("Property"))
        {
            if (n.HasChildNodes)
            {
//for any item you write directly the element{ tile:'yourTile', lat:'yourLat', lng:'yourLng' }
                foreach (XmlNode childNode in n)
                    {
                        if (childNode.Name=="GEOData")
                        {
                            literal1.text += "{title: '"+childNode.Attributes["City"].Value+"', lat: '"+childNode.Attributes["Longitude"].Value+"', lng: '"+childNode.Attributes["Latitude"].Valu+"'}";                        
                        }
                    }
            }
        }
        //Write the scripts end
        Literal1.text += "];</script>";
    }

【讨论】:

  • 以及我如何将值从后面的代码传递给中继器
  • 我不能很好地理解你的例子。
  • 在我的示例中,我没有使用中继器,而是使用文字,直接在 html 页面中编写 javascript 代码,无需中继器
  • java脚本代码是什么我会写的,如果你知道可以告诉我
  • 我现在用 cmets 编辑。如果您不明白,请给我发邮件,附上您的代码
猜你喜欢
  • 2014-10-24
  • 1970-01-01
  • 2020-09-03
  • 1970-01-01
  • 2021-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多