duohahawuwu~问题的价值

  博客园 :: 首页 :: 联系 :: 订阅 订阅 :: 管理
  3 Posts :: 0 Stories :: 6 Comments :: 2 Trackbacks

之前一直在看AJAX的东西,主要是老赵的文章和视频,但是一直就没有真正的实战过,今天手头的项目终于可以用到了,但是在理论界和实际的时候却出现了很多很多的问题。
目标:实现ScriptManager+Javascript+WebService == AJAX效果
步骤:
1.建立模板页
2.添加内容也
3.拖入ScriptManager
4.在ScriptManager中添加WebService的地址
5.在内容也添加UpdatePanel控件
6.添加WebService页
7.编写WebService后台程序
8.在内容页编写客户端脚本
9.测试
通过上面这些步骤想来实现最终的AJAX效果,结果出现了很多的问题
开始正文了!QA开始
1
Q:模板页是好东西,但是他的出现也带来了一些问题,最明显的问题就是空间的ID不在那么容易的掌握,从原来的你输入什么就是什么,变成了一大长串的东西让你无法轻易的找到。
A:通过XXXX.ClientID来解决问题,例如<%=Button1.ClientID%>
2
Q:ScriptManager能否加入多个WebService的地址
A:通过测试是可以的:)

1<asp:ScriptManager ID="ScriptManager1" runat="server">
2  <Services>
3   <asp:ServiceReference Path="/WebService/Product.asmx" InlineScript="false" />
4   <asp:ServiceReference Path="/WebService/PromotionZone.asmx" InlineScript="false" />
5  </Services>
6 </asp:ScriptManager>
7



3
Q:UpdatePanel是否是必须的,记得在看教程的时候没有
A:如果只是通过Javascript+WebService 来实现的话,完全的可以不使用UpdatePanel,要我说UpdatePanel是无敌的懒人的控件,成本太大了,所以上面的步骤中有一步可以省略了
4
Q:为什么我的Javascript不能调用WebService
A:Javascript+WebService 这样的方式需要在WebService 中添加一些引用
using System.Web.Script.Services;
在WebService 类的上面再加上一个声明[ScriptService]
最后在WebService的方法上面加上[WebMethod]
总的来说就是下面这个样子

 1using System;
 2using System.Web;
 3using System.Collections;
 4using System.Web.Services;
 5using System.Web.Services.Protocols;
 6using System.Web.Script.Services;
 7using System.Data;
 8
 9/// <summary>
10/// Product 的摘要说明
11/// </summary>

12[WebService(Namespace = "http://tempuri.org/")]
13[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
14[ScriptService]
15public class Product : System.Web.Services.WebService {
16
17    public Product () {
18
19        //如果使用设计的组件,请取消注释以下行 
20        //InitializeComponent(); 
21    }

22
23    [WebMethod]
24    public string HelloWorld() {
25        return "Hello World";
26    }

27}

28
29



5
Q:客户端调用WebService时不管用结果还不知道错误,这个东西还真的不好调试,怎么办
A:用过Javascript来调用WebService的时候是没有办法看到错误的,所以就需要自己准备一个错误处理机制,这样可以方便的看出问题在哪里。至于不能调用WebService多半是类的名称不对造成的,要不就是WebService的路径不对,下面是一段错误处理机制,嘿嘿,这里需要感谢老赵

 

 1//声明所有的Product的错误处理都交给failedCallback方法
 2Product.set_defaultFailedCallback(failedCallback);
 3 function failedCallback(error)
 4 {
 5  var message = String.format(
 6   "Timeout: {0}\nMessage: {1}\nExceptionType: {2}\nStackTrace: {3}",
 7   error.get_timedOut(),
 8   error.get_message(),
 9   error.get_exceptionType(),
10   error.get_stackTrace());
11 
12  alert(message);
13 }



6
Q:复杂的数据类型报错,说什么A circular reference was detected while serializing an object of type 'System.Reflection.Module'.反正是看不懂,最后才知道原来是返回的数据类型太复杂了
A:简单的字符串太不好处理,还是希望能处理复杂的数据类型,至少也要一个DataTable吧,有办法,需要下载一个ASP.NET Futures,然后引用一个Microsoft.Web.Preview.dll的类,最后修改一下Web.Config文件,做好以上几点就可以返回复杂的数据类型了,然后通过点呀点的就可以处理结果了,看不懂的JSON表达式可以说拜拜了,哈哈

1<jsonSerialization>
2    <converters>
3     <add name="DataSetConverter" type="Microsoft.Web.Preview.Script.Serialization.Converters.DataSetConverter, Microsoft.Web.Preview" />
4     <add name="DataRowConverter" type="Microsoft.Web.Preview.Script.Serialization.Converters.DataRowConverter, Microsoft.Web.Preview" />
5     <add name="DataTableConverter" type="Microsoft.Web.Preview.Script.Serialization.Converters.DataTableConverter, Microsoft.Web.Preview" />
6    </converters>
7   </jsonSerialization>


7
Q:也是最后的一个问题了,客户端脚本报错,找不到这个找不到那个的,反正是一堆错误,为啥呢
A:位置问题,不能再像以前那样写在Head里面了,最好是跟在调用Javascript的控件后面,虽然不好看,不过还是忍了吧

最后最后贴出来自己代码

MasterPage
############################################################################

 1
 2
 3
 4<%@ Master Language="C#" AutoEventWireup="true" CodeFile="MasterPage.master.cs" Inherits="MasterPage" %>
 5
 6<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 7
 8<html xmlns="http://www.w3.org/1999/xhtml" >
 9<head runat="server">
10    <title>无标题页</title>
11    <link href="StyleSheet.css" rel="stylesheet" type="text/css" />    
12</head>
13<body>
14    <form id="form1" runat="server">
15    <asp:ScriptManager ID="ScriptManager1" runat="server">
16  <Services>
17   <asp:ServiceReference Path="/WebService/Product.asmx" InlineScript="false" />
18   <asp:ServiceReference Path="/WebService/PromotionZone.asmx" InlineScript="false" />
19  </Services>
20 </asp:ScriptManager>
21 <script language="javascript" type="text/javascript">
22 Product.set_defaultFailedCallback(failedCallback);
23 PromotionZone.set_defaultFailedCallback(failedCallback);
24 function failedCallback(error)
25 {
26  var message = String.format(
27   "Timeout: {0}\nMessage: {1}\nExceptionType: {2}\nStackTrace: {3}",
28   error.get_timedOut(),
29   error.get_message(),
30   error.get_exceptionType(),
31   error.get_stackTrace());
32 
33  alert(message);
34 }

35 
</script>
36    <div>
37        <asp:contentplaceholder id="ContentPlaceHolder1" runat="server">
38            duohahawuwu
39        </asp:contentplaceholder>
40    </div>
41    </form>
42</body>
43</html>
44
45

Test.aspx
############################################################################

 1
 2
 3
 4<%@ Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="Test.aspx.cs" Inherits="Test" Title="Untitled Page" %>
 5
 6<%@ register assembly="AjaxControlToolkit" namespace="AjaxControlToolkit" tagprefix="cc1" %>
 7<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
 8    <href="javascript:void(0)" onclick="GoPre()">上一页</a>
 9    
10    <href="javascript:void(0)" onclick="GoPage(1)">1</a>
11    <href="javascript:void(0)" onclick="GoPage(2)">2</a>
12    
13    <href="javascript:void(0)" onclick="GoNext()">下一页</a>
14    
15    <href="javascript:void(0)" onclick="TwoWebService()">Two WebService</a>
16    <div id="div_result">
17        
18    </div>
19
20    <script language="javascript" type="text/javascript">
21    
22    var PageIndex = 0;
23    function GoPre()
24    {
25        PageIndex--;
26        Product.GetPageContent(PageIndex,PageResult);
27    }

28    function GoPage(NewPageIndex)
29    {
30        PageIndex = NewPageIndex;
31        Product.GetPageContent(PageIndex,PageResult);
32    }

33    function GoNext()
34    {
35        PageIndex++;
36        Product.GetPageContent(PageIndex,PageResult);
37    }

38    function PageResult(result)
39    {
40        var sb = new Sys.StringBuilder();
41        sb.append("<table border=1>");
42        for(var i = 0;i < result.rows.length;i++)
43        {
44            sb.append(String.format("<tr><td>{0}</td><td>{1}</td></tr>",result.rows[i]["Test"],result.rows[i]["Value"]));
45        }

46        
47        sb.append("</table>");
48        
49        $get("div_result").innerHTML = sb.toString();
50    }

51    function TwoWebService()
52    {
53        PromotionZone.HelloWorld(TwoWebServiceResult)
54    }

55    function TwoWebServiceResult(result)
56    {
57        alert(result);
58    }

59    
</script>
60</asp:Content>
61
62 
63
64

Product.asmx
############################################################################

 1using System;
 2using System.Web;
 3using System.Collections;
 4using System.Web.Services;
 5using System.Web.Services.Protocols;
 6
 7using System.Web.Script.Services;
 8using System.Data;
 9
10/// <summary>
11/// Product 的摘要说明
12/// </summary>

13[WebService(Namespace = "http://tempuri.org/")]
14[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
15[ScriptService]
16public class Product : System.Web.Services.WebService {
17
18    public Product () {
19
20        //如果使用设计的组件,请取消注释以下行 
21        //InitializeComponent(); 
22    }

23
24    [WebMethod]
25    public string HelloWorld() {
26        return "Hello World";
27    }

28
29    [WebMethod]
30    public DataTable GetPageContent(int PageIndex)
31    {
32        DataTable objDt = new DataTable();
33        objDt.Columns.Add("Test");
34        objDt.Columns.Add("Value");
35        if (PageIndex > 0)
36        {
37            for (int i = 0; i < PageIndex; i++)
38            {
39                DataRow objDr = objDt.NewRow();
40                objDr["Test"= i.ToString();
41                objDr["Value"= (i * i).ToString();
42                objDt.Rows.Add(objDr);
43            }

44        }

45
46        return objDt;
47    }

48    
49}

50
51 
52
53

Web.Config
############################################################################

  1<?xml version="1.0"?>
  2<configuration>
  3  <configSections>
  4    <sectionGroup name="system.web.extensions" type="System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
  5      <sectionGroup name="scripting" type="System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
  6          <section name="scriptResourceHandler" type="System.Web.Configuration.ScriptingScriptResourceHandlerSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="MachineToApplication"/>
  7        <sectionGroup name="webServices" type="System.Web.Configuration.ScriptingWebServicesSectionGroup, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
  8          <section name="jsonSerialization" type="System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"