Ajax冲突问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
今天在做一个网站页面时,需要用到 Ajax做局部刷新处理。
过程中出现了一些问题。
现共享如下,希望以后遇到的朋友能够有一点帮助。
问题呈现:
在UpdatePanel中加入了验证控件,并且有对TextBox_TextChanged事件的触发。
出现了验证控件失效的问题。
我首先将控件放在UpdatePanel之外是否有用?经过检验,验证控件放在UpdatePanel之外是可以正常执行的。
因此排除是验证控件或者VS2005本身的问题了。
在UpdatePanel中验证控件失效,而在其外面是不会失效。
可以大概推断时由于UpdatePanel控件和验证控件不兼容造成的。
问题解决:
在有了上面的推断后,我尝试去寻找解决方法。
在网上搜索得知,果真有类似的问题。
按着其解决方案处理,问题得到解决,看来推断是正确的。
解决方法如下:
1.将验证控件的“EnableClientScript”属性设置为False即可。
由此我
产生了几个问题,还望高手能够指导。
a)UpdatePanel与验证控件不兼容,原因何在?
b)UpdatePanel中控件事件中无法使用Response.Write(),为什么?
c)UpdatePanel中如何实现弹出窗口?
2.这种方法是直接安装微软补丁,补丁地址如下:
/post/2007/09/25/aspnet-ajax-validator-update-kb93
4839.aspx
问题拓展:
VS2005开发环境中使用 AJAX控件要注意的问题
控件与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后,无法弹出对话框
在使用 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: ///TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="/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_pageLoa ding(
function(sender,e)
{
var dataItem = e.get_dataItems()["<%= this.UpdatePane l1.ClientID %>"]();
alert();
});
</script>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:Button ID="btnTest" runat="server" OnClick="btnT
est_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.Upd atePanel1, "var _f = function(){alert('Hello World!');}; _f;", true); }
}。