大多数情况下,我们不会再Javascript中直接创建JSON字符串。而是,创建一些Javascript对象,这些对象和服务器上的.net对象对应。因此,可以在服务器上创建.net实体类,然后串行化成JSON格式,随后在浏览器中反串行化为Javascript对象。
Album.asmx
<%@ WebService Language="C#" Class="AlbumProxy" %> using System; using System.Web; using System.Web.Services; using System.Web.Services.Protocols; using System.Web.Script.Services; using System.Net; using System.Xml.Serialization; using System.Web.Script.Serialization; public class Album { private string _artist = String.Empty; private string _title = String.Empty; private int _releaseYear; private string[] _tracks = new string[16]; private DateTime _dateTime = DateTime.Now; private string _personalInfo = "do not show this"; [ScriptIgnore] public string PersonalInfo { get { return _personalInfo; } set { _personalInfo = value; } } public Album() { } public string Artist { get { return _artist; } set { _artist = value; } } public string Title { get { return _title; } set { _title = value; } } public int ReleaseYear { get { return _releaseYear; } set { _releaseYear = value; } } public string[] Tracks { get { return _tracks; } set { _tracks = value; } } } [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] //若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。 [System.Web.Script.Services.ScriptService] public class AlbumProxy : System.Web.Services.WebService { private Album _album; public AlbumProxy() { _album = new Album(); _album.Artist = "Phish"; _album.Title = "A Picture of Nectar"; _album.ReleaseYear = 1992; _album.Tracks.SetValue("Llama", 0); _album.Tracks.SetValue("Eliza", 1); _album.Tracks.SetValue("Cavern", 2); _album.Tracks.SetValue("Poor Heart", 3); _album.Tracks.SetValue("Stash", 4); _album.Tracks.SetValue("Manteca", 5); _album.Tracks.SetValue("Guelah Papyrus", 6); _album.Tracks.SetValue("Magilla", 7); _album.Tracks.SetValue("The Landlady", 8); _album.Tracks.SetValue("Glide", 9); _album.Tracks.SetValue("Tweezer", 10); _album.Tracks.SetValue("The Mango Song", 11); _album.Tracks.SetValue("Chalk Dust Torture", 12); _album.Tracks.SetValue("Faht", 13); _album.Tracks.SetValue("Catapult", 14); _album.Tracks.SetValue("Tweezer Reprise", 15); } [WebMethod] [XmlInclude(typeof(Album))] public object GetAlbum() { return _album; } [WebMethod] [XmlInclude(typeof(Album))] public object GetAlbumJSON() { JavaScriptSerializer serializer = new JavaScriptSerializer(); return serializer.Serialize(_album); } }
ScriptProxy.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ScriptProxy.aspx.cs" Inherits="Chap9Project.ScriptProxy" %> <%@ Import Namespace="System.Web.Script.Serialization" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> <script type="text/javascript"> function pageLoad() { AlbumProxy.GetAlbumJSON(completionJSON); AlbumProxy.GetAlbum(completionObject); } function completionJSON(result) { alert(result); var album = Sys.Serialization.JavaScriptSerializer.deserialize(result); $get('placeholder').innerHTML = album.Artist; } function completionObject(album) { alert(album); $get('placeholder2').innerHTML = album.ReleaseYear; } </script> </head> <body> <form id="form1" runat="server"> <div> <asp:ScriptManager ID="ScriptManager1" runat="server"> <Services> <asp:ServiceReference Path="~/Album.asmx" /> </Services> </asp:ScriptManager> <div id="placeholder"></div> <br /> <div id="placeholder2"></div> </div> </form> </body> </html>