英文MSDN论坛中ASP.NET AJAX 的常见问题和解答

重要说明:本内容是由 Microsoft 机器翻译软件而不是人工译者来翻译的。机器翻译的文章并不总是完美的。它可能包含词汇或语法方面的错误,就像一个外国人在用您的语言说话时可能犯的错误。我们使用机器翻译的目的,是希望以您惯用的语言,提供更多的内容。因此,我们非常重视您的反馈意见。如果您对此主题下方的机器翻译文章有任何意见,欢迎您随时提出。。

英文原文:http://forums.asp.net/t/1198016.aspx

ASP.NET AJAX 的常见问题和解答

 

1.如何在生产服务器上配置 AJAX?
以下是一些我们需要建立一个 AJAX 的网站上的生产服务器上执行的操作。
1。 在服务器上安装 AJAX 扩展
2。 为应用程序在 IIS 中配置虚拟目录
3。 配置应用程序的 ASP.NET 版本为 2.0
4。 添加一些项来注册必要程序集 HttpHandlers,Web.config 中等。
最简单的方法是创建一个使用 ASP.NET AJAX 的网站模板的网站。 如果要更新现有网站请手动编辑 Web.config 文件。 此文档 ( http://asp.net/AJAX/Documentation/Live/ConfiguringASPNETAJAX.aspx ) 和两个教程视频 ( I: ASP.NET AJAX 如何实现-启用现有的 Web 服务? , 如何实现-I: 添加 ASP.NET AJAX 功能到现有的 Web 应用程序? ) 解释是需要和原因。

 

2.如何处理错误 500?
错误状态代码 500 指示有一个问题当服务器尝试处理请求。 可以有变量的原因。 问题是如何找出了错误,真正原因。
找出的两个方法如下:
1。 在代码,负责处理请求中, 设置一个断点,然后通过,找出异常被引发 ; 调试
2。 在响应中通常返回实际的错误信息。 我们可以使用的 HTTP 嗅探器 (例如,Fiddler) 扫视到,在客户端和服务器,以了解错误消息之间的通信。

 

3.如何执行的操作在特定阶段的部分 PostBack?
Microsoft AJAX 库中有是一个客户端生命周期模型类似于在服务器端页面生命周期。 开发人员可以添加不同的事件处理程序以执行特定操作在一个特定的状态。 在为例禁用页前的一个按钮即将张贴在 beginRequest 事件处理然后中启用它再次 endRequest 事件处理程序。
此文档 ( AJAX 客户端生命周期事件 ) 包含这些事件,以及如何使用它们的顺序的完整说明。

相关的线程:
http://forums.asp.net/t/1109705.aspx

 

4.为什么我收到 PageRequestManagerParserErrorException?
当我们正与 UpdatePanel 时,可能会发生此异常。 于一部分 PostBack 请求等同完全正常 PostBack ’s。 区别是与在 XmlHttpRequest 发送请求。 另一个显著区别是对请求响应特定的格式。
通常,该响应只包含内容,必须更新 UpdatePanels 并以便可由客户端库更新页面进行分析,它必须按照指定的格式。
尝试一些其他与 Response.Write,Server 跟踪输出或修改与 HttpModule 输出,响应 Won’t 符合格式再。 因此,客户端库不能分析它。 因此发生,异常。
为了摆脱这,我们不应在页上没有 UpdatePanel 使用上述功能。

相关的线程:http://forums.asp.net/p/1140794/1844602.aspx

 

5 如何为的 UpdatePanel 触发器在 UserControl 中注册控件事件的?
最佳的解决方案是泡沫设立控件的事件为用户控件的自定义事件。 然后为的 UpdatePanel 触发器注册自定义事件的 UserControl。
1。 定义自定义委托和事件的 UserControl
2。 设立冒泡在事件激发自定义事件
3。 注册自定义事件的 UserControl 为像一个普通的控件在 UpdatePanel 触发器

这里是一个示例:

<%@ Control Language="C#" ClassName="TestUc" %>
<script runat="server">
    public delegate void ClickEventHandler(object sender, CommandEventArgs e);
    public event ClickEventHandler TestCustomEvent;
    protected void lb_Command(object sender, CommandEventArgs e)
    {   // bubble up the command event as TestCustomEvent
        if (TestCustomEvent != null) TestCustomEvent(this, e);
    }
</script>
<asp:LinkButton ID="LinkButton1" runat="server" CommandArgument="LinkButton1" OnCommand="lb_Command">LinkButton1</asp:LinkButton>
<asp:LinkButton ID="LinkButton2" runat="server" CommandArgument="LinkButton2" OnCommand="lb_Command">LinkButton2</asp:LinkButton>
  
<%@ Page Language="C#" %>
<%@ Register src="TestUc.ascx" TagName="TestUc" TagPrefix="uc1" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
    protected void TestUc1_TestCustomEvent(object sender, CommandEventArgs e)
    {
        Label1.Text = DateTime.Now.ToString();
    }
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title>Trigger UpdatePanel</title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp: ScriptManager ID="ScriptManager1" runat="server">
            </asp: ScriptManager>
            <uc1:TestUc id="TestUc1" runat="server" OnTestCustomEvent="TestUc1_TestCustomEvent">
            </uc1:TestUc>
            <asp:UpdatePanel ID="UpdatePanel1" runat="server">
                <ContentTemplate>
                    <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
                </ContentTemplate>
                <Triggers>
                    <asp:AsyncPostBackTrigger ControlID="TestUc1" EventName="TestCustomEvent" />
                </Triggers>
            </asp:UpdatePanel>
        </div>
    </form>
</body>
</html>

 

相关的线程:
http://forums.asp.net/t/1138191.aspx
http://forums.asp.net/t/1123812.aspx
http://forums.asp.net/t/1141328.aspx
http://forums.asp.net/t/1175921.aspx

 

 

6 如何为 UpdatePanel,在另一个 UserControl,触发器在一个 UserControl 中注册控件事件的?
以这样做我们可以先定义一个自定义的属性公开隐藏的触发器的 UserControl (说"UserControlA") 的 UpdatePanel 控件的客户端 ID。 在其它 UserControl (说"UserControlB"),我们将能够引发 Click 事件的隐藏的触发器控件。
具体步骤如下:
1。 定义自定义属性来存储一个隐藏的触发器控件的更新面板 (Button1clientID 属性的库用户控件) 的客户端 ID: 

<%@ Control Language="C#" ClassName="Gallery" %>
<script runat="server">
    protected void Button1_Click(object sender, EventArgs e)
    {
        Label1.Text = DateTime.Now.ToString();
    }
    public string Button1clientID
    {
        get
        {
            return Button1.ClientID;
        }
    }
</script>

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
    <ContentTemplate>
        <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
        <div style="visibility: hidden">
            <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" UseSubmitBehavior="false" Text="Button" /></div>
    </ContentTemplate>
</asp:UpdatePanel>


2。 其他用户控件 (Button1clientID 属性的上载用户控件) 中定义一个自定义属性: 
 <%@ Control Language="C#" ClassName="Upload" %>
<script runat="server">
    private string buttonclientID = "";
    public string Button1clientID
    {
        set
        {
            buttonclientID = value;
        }
    }
</script>

 

3。 设置 Upload1.Button1clientID 中,page = Gallery1.Button1clientID: 
<script runat="server">
    protected void Page_Load(object sender, EventArgs e)
    {
        Upload1.Button1clientID = Gallery1.Button1clientID;
    }
</script>


4。 手动激发隐藏的触发器控件,Click 事件: 
<script type="text/javascript">
     function submitForm()
     {
         document.getElementById("<%=buttonclientID %>").click();
     }
</script>

下面是完整的示例代码:
http://forums.asp.net/p/1117746/1739422.aspx#1739422

相关的线程:
http://forums.asp.net/t/1117746.aspx
http://forums.asp.net/t/1136932.aspx

 

7.如何 ScriptManager 和 UpdatePanel 向添加 MasterPage 从 ContentPage 动态?
需要的页面的初始化阶段之前,必须添加 ScriptManager。 否则,将引发 InvalidOperationException (它报告说在页上缺乏 ScriptManager)。 最好在 Page _ PreInit,激发之前初始化中添加它。
例如:

 protected void Page_PreInit(object sender, EventArgs e)
{
        HtmlForm form1 = (HtmlForm)Master.FindControl("form1");
        ScriptManager sm = new ScriptManager();
        sm.ID = "ScriptManager1";
        form1.Controls.AddAt(0, sm);
        // add a UpdatePanel and moves an existing control into it
        UpdatePanel panel = new UpdatePanel();
        panel.ID = "upMaster";
        Control ctrl = ((Control)Master.FindControl("TextBox1"));
        panel.ContentTemplateContainer.Controls.Add(uc);
        form1.Controls.Add(panel);
}
 

相关的线程:
http://forums.asp.net/t/1165939.aspx
http://forums.asp.net/t/1160425.aspx
http://forums.asp.net/t/1163971.aspx

 

8.可以 HyperLink UpdatePanel 触发器?
号 请参阅此文件: http://www.asp.net/AJAX/documentation/live/mref/P_System_Web_UI_UpdatePanelControlTrigger_ControlID.aspx 。 触发器必须实现 INamingContainer、 IPostBackDataHandler 或 IPostBackEventHandler 接口。 HyperLink 未实现任何人。
参阅:
1。 INamingContainer
2。 IPostBackDataHandler
3。 IPostBackEventHandler
相关的线程:
http://forums.asp.net/t/1138804.aspx
http://forums.asp.net/t/1099204.aspx
http://forums.asp.net/t/1170105.aspx

 

9.如何触发在不同的窗口中的部分 PostBack?
当我们需要触发部分 PostBack 从不同窗口时,有宗个案。 例如: 触发父窗口中的部分 PostBack,从 IFrame,触发部分 PostBack opener 从弹出窗口中的。
我们可以 pageA 上, 添加一个无形按钮 (说 Button 1) 并设置为 UpdatePanel,触发器然后我们需要,触发部分 PostBack 获取从 pageB 和消防单击此按钮的引用。 是达到与以下 Javascript。
"window.parent.document.getElementById('Button1').Click()"
"window.opener.document.getElementById('Button1').Click()"
下面是完整的示例代码:
http://forums.asp.net/p/1162285/1927000.aspx#1927000

相关的线程:
http://forums.asp.net/t/1162285.aspx
http://forums.asp.net/t/1117770.aspx
http://forums.asp.net/t/1169365.aspx

 

10.如何操作客户端上的 AJAX Timer 控件?
若要应付 Timer 控件客户端上的,我们需要使用这样的 $ Find 方法获取客户端组件的引用:       
var timer = $find("Timer1");
然后,我们可以调用 set_interval 方法来设置计时器控件、 _stopTimer 方法停止它和 _startTimer 方法来启动它的间隔。
这里是一个示例:
<asp:Timer ID="Timer1" runat="server" Interval="3000">
</asp:Timer>
<input id="Button1" type="button" value="ChangeInterval" onclick="setTimer();"/>
<input id="Button2" type="button" value="Start" onclick="startTimer();"/>
<input id="Button3" type="button" value="Stop" onclick="stopTimer();"/>
<script type="text/javascript">
    function setTimer()
    {
        var timer = $find("Timer1");
        timer.set_interval(100);
    }
   
    function startTimer()
    {
        var timer = $find("Timer1");
        timer._startTimer();
    }
   
    function stopTimer()
    {
        var timer = $find("Timer1");
        timer._stopTimer();
    }
</script>
相关的线程:
http://forums.asp.net/t/1159648.aspx
http://forums.asp.net/t/1163431.aspx

 

11.有用链接
AJAX 扩展官方网站
http://www.asp.net/AJAX/
关于 AJAX 扩展文档
http://www.asp.net/AJAX/documentation/
视频教程的 AJAX
http://www.asp.net/learn/AJAX-videos/
AJAX Control Toolkit 项目页面
http://www.codeplex.com/Wiki/view.aspx?ProjectName=AtlasControlToolkit
AJAX 控件 Toolkit 联机示例
http://www.asp.net/AJAX/AJAXcontroltoolkit/samples/
如何播放动画?
http://blogs.msdn.com/phaniraj/archive/2007/04/13/animations-how-many-ways-do-i-call-thee.aspx
如何: 在页中 Re-use 动画扩展程序
http://blogs.msdn.com/phaniraj/archive/2007/08/15/how-to-re-use-animation-extenders-in-a-page.aspx
如何: 在一个页面上执行 AJAX 控件扩展程序的所有实例上的操作
http://blogs.msdn.com/phaniraj/archive/2007/08/15/how-to-re-use-animation-extenders-in-a-page.aspx
如何: 在您 AutoCompleteExtender 中使用私钥值
http://blogs.msdn.com/phaniraj/archive/2007/06/19/how-to-use-a-key-value-pair-in-your-autocompleteextender.aspx
脚本从女士 AJAX AnimationExtender 播放动画
http://blogs.msdn.com/phaniraj/archive/2007/05/31/scripting-animations-from-the-ms-AJAX-animationextender.aspx
HowTo: 更改 Visible 选项卡在 MS AJAX TabControl 中使用 JavaScript
http://blogs.msdn.com/phaniraj/archive/2007/04/16/howto-change-visible-tab-using-javascript-in-the-ms-AJAX-tabcontrol.aspx
显示和隐藏从 JavaScript ModalPopupExtender
http://blogs.msdn.com/phaniraj/archive/2007/02/20/show-and-hide-modalpopupextender-from-javascript.aspx
从客户端更改 ServiceMethods 和,AutoCompleteExtender 的 Web 服务
http://blogs.msdn.com/phaniraj/archive/2007/02/16/change-servicemethods-and-Web-service-for-the-autocompleteextender-from-client-side.aspx

posted on 2010-12-30 13:33  carekee  阅读(327)  评论(0)    收藏  举报