zoukankan      html  css  js  c++  java
  • 【整理】UpdatePanel中验证控件失效问题

             今天在做一个网站页面时,需要用到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);
        }
    }
  • 相关阅读:
    【转】苹果App Store审核指南中文翻译(更新)
    ios中的coredata的使用
    iOS开发——网络编程OC篇&Socket编程
    [深入浅出Cocoa]iOS网络编程之Socket
    RESTful架构详解
    IOS开发 REST请求 ASIHTTPRequest用法
    iOS 8 AutoLayout与Size Class自悟
    nodejs入门demo
    微信公众号查询账户余额等
    微信公众号token验证失败的一些总结
  • 原文地址:https://www.cnblogs.com/zwffff/p/1432579.html
Copyright © 2011-2022 走看看