update控件的使用

 今天在做一个网站页面时,需要用到Asp.net Ajax做局部刷新处理。过程中出现了一些问题。现共享如下,希望以后遇到的朋友能够有一点帮助。

         问题呈现:

         在UpdatePanel中加入了验证控件,并且有对TextBox_TextChanged事件的触发。出现了验证控件失效的问题。

         我首先将控件放在UpdatePanel之外是否有用?经过检验,验证控件放在UpdatePanel之外是可以正常执行的。因此排除是验证控件或者VS2005本身的问题了。

         在UpdatePanel中验证控件失效,而在其外面是不会失效。可以大概推断时由于UpdatePanel控件和验证控件不兼容造成的。

         问题解决:

         在有了上面的推断后,我尝试去寻找解决方法。在网上搜索得知,果真有类似的问题。按着其解决方案处理,问题得到解决,看来推断是正确的。解决方法如下:

1.         将验证控件的“EnableClientScript”属性设置为False即可。由此我产生了几个问题,还望高手能够指导。

a)         UpdatePanel与验证控件不兼容,原因何在?

b)         UpdatePanel中控件事件中无法使用Response.Write(),为什么?

c)         UpdatePanel中如何实现弹出窗口?

2.         这种方法是直接安装微软补丁,补丁地址如下:http://blog.dottor.net/post/2007/09/25/aspnet-ajax-validator-update-kb934839.aspx

问题拓展:

VS2005开发环境中使用ASP.NET AJAX控件要注意的问题

1.         Asp.net控件与UpdatePanel控件不兼容

与UpdatePanel控件不兼容的空间主要有:

a)         TreeView控件、Menu控件、Web Parts控件和Substitution控件。

b)         登录控件,如:Login控件、LoginView控件等。在默认情况下,上述控件与UpdatePanel控件是不兼容的,但当上述控件转换为可编辑状态时,则两者可以兼容。

c)         验证控件,如:RegularExpressionValidator控件、CompareValidator控件等。要使得两者可以互相兼容,可参照前面“问题解决”小节。

d)         GridView控件和DetailsView控件,默认情况下可以正常兼容使用,但当把它们的EnableSortingAndPagingCallbacks属性设置为true时,GridView和DetailsView中的排序和分页部分功能会失效。

e)         FileUpload控件。FileUpload控件在默认情况下,放在UpdatePanel中并且有控件触发时,不能发挥上传作用。但是当UpdatePanel的Triggers属性中,设置触发控件(例如Button,)为PostBack时,FileUpload可以发挥上传功能,只是整个页面不能局部刷新。

2.         页面跳转出现问题

如果UpdatePanel内有触发页面跳转的控件(如Button),那么该控件的事件中就不能用如下的语句,否则会弹出异常的对话框。

a)         调用Response.Write()

b)          调用Response.Filter

c)         HttpModules

d)         调用Server.Transfer()

3.         利用UpdatePanel后,无法弹出对话框

在使用ASP.NET AJAX控件后,如果想利用Js脚本来输出一些提示对话框,往往会想到利用 Page.Register ClientScriptBlock或者 Page.RegisterStartupScript注册,但是,页面上仍然没有提示信息。利用如下两种方法即可以解决这个问题:

a)         ScriptManager.RegisterClientScriptBlock(UpdatePanel1,this.GetType(),"click","alert('提示信息')",true);就可以正常的显示弹出对话框。需要注意的是:如果在页面中有多个UpdatePanel,如果每个UpdatePanel的UpdateMode的属性值都是“always”(默认值),则可以使用那个UpdatePanel的实例作为参数;如果每个UpdaePanel的UpdateMode属性值为conditional,那么就必须使用正在更新的那个UpdatePanel作为参数,这样脚本才能起作用。

b)         注册DataItem方法

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

<!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>
        <asp:ScriptManager ID="ScriptManager1" runat="server">
        </asp:ScriptManager>
        <script type="text/javascript">
            Sys.WebForms.PageRequestManager.getInstance().add_pageLoading(
            function(sender,e)
            {
                var dataItem = e.get_dataItems()["<%= this.UpdatePanel1.ClientID %>"](); 
                alert(dataItem.Name); 
             }); 
        </script>
        <asp:UpdatePanel ID="UpdatePanel1" runat="server">
            <ContentTemplate>
                <asp:Button ID="btnTest" runat="server" OnClick="btnTest_Click" Text="Test" />
                               
            </ContentTemplate>
        </asp:UpdatePanel>
    </div>
    </form>
</body>
</html>

后台代码:

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;

using System.Web.Script.Serialization;

public partial class dev_Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void btnTest_Click(object sender, EventArgs e)
    {
        JavaScriptSerializer serializer = new JavaScriptSerializer();
        ScriptManager.GetCurrent(this.Page).RegisterDataItem(this.UpdatePanel1, "var _f = function(){alert('Hello World!');}; _f;", true);
    }
}

参照文章:http://blog.csdn.net/oec2003/archive/2008/01/19/2053205.aspx





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值