现在的位置: 首页 > 综合 > 正文

【整理】UpdatePanel中验证控件失效问题

2013年01月02日 ⁄ 综合 ⁄ 共 3867字 ⁄ 字号 评论关闭

         今天在做一个网站页面时,需要用到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时,GridViewDetailsView中的排序和分页部分功能会失效。

e)         FileUpload控件。FileUpload控件在默认情况下,放在UpdatePanel中并且有控件触发时,不能发挥上传作用。但是当UpdatePanelTriggers属性中,设置触发控件(例如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(UpdatePanel1this.GetType()"click""alert('提示信息')"true);就可以正常的显示弹出对话框。需要注意的是:如果在页面中有多个UpdatePanel,如果每个UpdatePanelUpdateMode的属性值都是“always”(默认值),则可以使用那个UpdatePanel的实例作为参数;如果每个UpdaePanelUpdateMode属性值为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);
    }
}

抱歉!评论已关闭.