周公的专栏

弱水三千,只取一瓢饮。你看见我的瓢了吗?

用户操作
[即时聊天] [发私信] [加为好友]
周公ID:zhoufoxcn
205835次访问,排名345好友272人,关注者328
6年的Java和.net开发经验。熟悉数据库及软件性能优化。
zhoufoxcn的文章
原创 149 篇
翻译 5 篇
转载 70 篇
评论 585 篇
周公的公告
英文名:zhoufoxcn
昵称:周公
职业:程序开发
成为MVP时间:2008.07
爱好:编程,旅游,写作
转载本人原创文章请注明出处,并且请勿用于商业用途,谢谢合作!
最近评论
awei0916:非常好,谢谢!
awei0916:非常好,谢谢!
chenshu123120:为什么我的gridview不能输出,内容为空啊
chenshu123120:为什么我的gridview不能输出,内容为空啊
yzbsd:document.getElementById("errorMsg1").innerText=Test.CheckAge(parseInt(age)).value;
应该改为:
document.getElementById("errorMsg1").innerText=Test.CheckAge(parseInt(age.value)).value;
文章分类
收藏
    相册
    .net
    mengyao||Andy 路鑫(RSS)
    The Code Project
    剑了(RSS)
    山西.net俱乐部
    张子阳(RSS)
    Java
    张森炜的博客(RSS)
    娱乐资源
    天下网
    天下网生活论坛(RSS)
    存档
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 AjaxPro与服务器端交互过程中如何传值收藏

    新一篇: 用AjaxPro实现二级联动 | 旧一篇: 在List范型集合中实现自定义条件复杂查询

    用asp.net开发Ajax有两种主流,一种是微软推出的技术,其中一个最常用的就是UpdatePanel控件,还有一种是AjaxPro技术。

    这种技术有着各自的特点。采用微软的技术开发也沿用了微软一贯的简单化、傻瓜化的特点,开发简单Ajax程序几乎不需要了解任何网页脚本知识和XHTML知识,缺点也有一些,通常会带来一些不必要的网络流量(整个UpdatePanel控件内所有的控件内容都会提交),另外在VS2005下经常会出现“***不是已知元素 原因可能是网站中存在编译错误 ”的提示,虽然有治标不治本的办法(见拙作:***不是已知元素 原因可能是网站中存在编译错误中提到的解决办法),但是经常出现这种提示,也够让人心烦的。

    而AjaxPro的起点较高,需要开发人员孰知Js脚本知识和XHTML相关知识,因为所有的方法需要你自己编写网页脚本。开发速度相对会较慢一点,调试也会困难一点(JS调试就是麻烦)。

    网上有不少讲述怎么使用AjaxPro调用服务器端方法的例子,我大概看了一下,估计只有一个原本,然后被Copy了N遍,所以到处都是,可惜的是那篇文章里没有降到如何把客户端的数据传送到服务器,比如我想在用户注册时那个用户名是否被注册了,怎么办?

    查看了网上雷同的N篇文章之后没有找到答案,后来自己琢磨了很久,才琢磨出来,下面展示一下用法。

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Test.aspx.cs" Inherits="Test" %>

    <!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>
    </head>
    <body>
        
    <form id="form1" runat="server">
        
    <div>
            
    <table width="95%" border="0" align="center" cellpadding="3" cellspacing="1" bordercolor="#FFFFFF" style="border-collapse: collapse">
                                    
    <tr align="center">
                                      
    <td height="20" colspan="2">&nbsp;</td>
                                    
    </tr>
                                    
    <tr class="tdbg" >
                                      
    <td width="50%"><b>用户名:</b><BR>
                                        不能超过14个字符(7个汉字)
    </td>
                                      
    <td width="50%" align="left">
                                          
    <asp:TextBox ID="txtUserName" runat="server" CssClass="input" Columns="30" MaxLength="14" onblur="javascript:checkName();void(0);"></asp:TextBox><div id="errorMsg"></div><font color="#FF0000">*</font> 
                                          
    </td>
                                    
    </tr>
                                    
    <tr class="tdbg" >
                                      
    <td width="50%"><strong>年龄:</strong></td>
                                      
    <td width="50%" align="left">
                                          
    <asp:TextBox ID="txtAge" runat="server" CssClass="input" Columns="30" MaxLength="50" onblur="javascript:checkAge();void(0);"></asp:TextBox><div id="errorMsg1"></div></td>
                                    
    </tr>
                                  
    </table>
        
        
    </div>
        
    <script language="javascript" type="text/javascript" defer="defer"> 
        
    function checkName()
        {
            
    var name=document.getElementById("<%=txtUserName.ClientID %>");
            document.getElementById(
    "errorMsg").style.display="block";
            document.getElementById(
    "errorMsg").style.color="red";
            document.getElementById(
    "errorMsg").innerText=Test.CheckUserName(""+name.value+"").value;
            
        }
        
        
    function checkAge()
        {
            
    var age=document.getElementById("<%=txtAge.ClientID %>");
            document.getElementById(
    "errorMsg1").style.display="block";
            document.getElementById(
    "errorMsg1").style.color="red";
            document.getElementById(
    "errorMsg1").innerText=Test.CheckAge(parseInt(age)).value;
            
        }
    </script>
        
    </form>
    </body>
    </html>
    后台代码:Test.cs
    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;


    /**
     * 写作说明:本文展示了如何利用AjaxPro与服务器交互,并且给服务器传值的情况。
     * 作者:周公
     * 日期:2008-1-1
     * 首发地址:
    http://blog.csdn.net/zhoufoxcn/
     *
    */
    public partial class Test : System.Web.UI.Page
    {
        
    protected void Page_Load(object sender, EventArgs e)
        {
            
    if (!Page.IsPostBack)
            {
                
            }
            AjaxPro.Utility.RegisterTypeForAjax(
    typeof(Test));//注册
        }
        [AjaxPro.AjaxMethod]
        
    public string CheckUserName(string name)
        {

            
    if (string.IsNullOrEmpty(name))
            {
                
    return "请填写用户名";
            }
            
    else if (ExistUserName(name))
            {
                
    return "该用户名已被注册";
            }
            
    else
            {
                
    return "可以注册";
            }
        }
        [AjaxPro.AjaxMethod]
        
    public string CheckAge(int age)
        {
            
    if (age > 80 || age < 10)
            {
                
    return "别忽悠我了";
            }
            
    else
            {
                
    return "正常范围";
            }
        }
        
    //为简化程序,这里将从数据库检查是否有重复的用户名这一步简单为一个方法
        
    //可以在这里写实际的数据库检查代码
        private bool ExistUserName(string name)
        {
            
    if (name.StartsWith("a"|| name.StartsWith("c"))
            {
                
    return true;
            }
            
    else
            {
                
    return false;
            }
        }
    }
    说明:在前台aspx代码中我们写了两个Js方法,负责与服务器的交互,分别是function checkName()和checkAge(),请注意看:
    <script language="javascript" type="text/javascript" defer="defer"> 
        
    function checkName()
        {
            
    var name=document.getElementById("<%=txtUserName.ClientID %>");
            .......省略无关代码
             document.getElementById(
    "errorMsg").innerText=Test.CheckUserName(""+name.value+"").value;
            
        }
        
        
    function checkAge()
        {
            
    var age=document.getElementById("<%=txtAge.ClientID %>");
            .......省略无关代码
            document.getElementById(
    "errorMsg1").innerText=Test.CheckAge(parseInt(age.value)).value;
        }
    </script>
    细心的朋友会发现在后台Test.cs里就有CheckUserName(string name)和public string CheckAge(int age)两个方法,在js里我们就是通过Test.CheckUserName()和Test.CheckAge()来调用的,这两个服务器端方法与平常所熟悉的方法声明有点不一样,如下:
    [AjaxPro.AjaxMethod]
        
    public string CheckUserName(string name)
        {
           ....
    //方法体略
         }
        [AjaxPro.AjaxMethod]
        
    public string CheckAge(int age)
        {
          ....
    //方法体略
         }

    其中[AjaxPro.AjaxMethod]表明它们是可以被js代码所调用的,另外两个方法需要的参数类型不同,一个是string类型,一个是int类型,而js中数据没有类型的,因为都是var来声明的,所以如何把参数值和参数类型传给服务器还是一个麻烦问题。

    查阅了资料,发现可以通过上述的方式解决:
    Test.CheckUserName(""+name.value+""),服务器就自动把参数值当字符串类型来识别了;//""+参数值
    Test.CheckAge(parseInt(age)),服务器就会把参数当整数来识别了。//parseInt(参数值)

    看看运行效果:
    出错效果:

    正常效果:

    最后,周公还要提醒大家一下,别忘了在Page_Load方法里调用AjaxPro.Utility.RegisterTypeForAjax(typeof(你的aspx页面所依附的class名称));这句话。另外有关AjaxPro的介绍请参考网上其它资料。

    发表于 @ 2008年01月05日 16:46:00|评论(loading...)|收藏

    新一篇: 用AjaxPro实现二级联动 | 旧一篇: 在List范型集合中实现自定义条件复杂查询

    评论

    #ttkk1024 发表于2008-01-07 15:32:28  IP: 218.26.96.*
    给你顶一把
    #nana 发表于2008-01-09 22:13:54  IP: 221.205.106.*
    拜读完后,非常兴奋,有尝试着像你一样真正写些东西的冲动
    thanks~
    #zhoufoxcn 发表于2008-01-10 13:07:50  IP: 118.81.74.*
    to nana:
    很好嘛,写出来大家共同分享嘛。
    以前我项目紧没时间,这段时间稍微清闲一点,于是把以前的一些心得路路续续整理出来,大家觉得有用的话,不妨支持一下,如果有不妥之处,大家也不放斧正一下。
    #weisheng_lu 发表于2008-04-14 17:24:07  IP: 116.60.6.*
    不错哦。。。
    #xiaoK 发表于2008-06-13 23:10:01  IP: 219.134.251.*
    初级入门教材!
    2008-06-17 07:48:14作者回复
    不错,这是AjaxPro系列中一篇,整个系列都是入门级的。
    #jly990216 发表于2008-07-12 15:55:21  IP: 123.131.73.*
    讲得很细!非常感谢!!
    #望穿秋水 发表于2008-08-03 14:10:46  IP: 211.144.82.*
    不错!!!!!!!11
    #ltb55232133 发表于2008-09-10 08:58:19  IP: 61.187.16.*
    确实不错谢谢了 周老师
    #xwk789xwk 发表于2008-10-07 15:16:04  IP: 219.137.202.*
    请问一下,我按你上面这种做法,为什么在运行的时候老是出现错误,提示"Test"未定义。
    2008-10-07 15:58:03作者回复
    我的代码在本地测试没有报错,由于没有你的运行环境,我也无法具体确定你的原因到底是什么,需要说明的是,需要在web.config中配置使用AjaxPro的,不知道你配置了没有?
    2008-10-07 16:24:10作者回复
    请看如何配置AjaxPro:http://www.dotnet.sx.cn/showtopic-424.aspx
    其实配置很简单的。
    #yzbsd 发表于2008-10-10 12:58:30  IP: 218.58.11.*
    document.getElementById("errorMsg1").innerText=Test.CheckAge(parseInt(age)).value;
    应该改为:
    document.getElementById("errorMsg1").innerText=Test.CheckAge(parseInt(age.value)).value;
    2008-10-10 13:56:09作者回复
    是吗?上面的代码是我本地测试正确之后才会放上去的。
    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © 周公