65.9K
CodeProject 正在变化。 阅读更多。
Home

集成 AJAX

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.67/5 (3投票s)

2007 年 1 月 27 日

5分钟阅读

viewsIcon

54157

downloadIcon

503

以下是将 AJAX 集成到您的 .NET Web 应用程序中,而无需使用 Atlas 的方法

AJAX Integration

引言

本文介绍如何在不使用 Atlas 或已为您准备好相关功能的控件的情况下,将 AJAX 集成到您的网站中。这对于无法使用 Atlas 的环境很有用。如果您想更深入地了解异步客户端-服务器通信的工作原理及其涉及的问题,这篇文章也很有趣。介绍的技术包括将 JavaScript 嵌入 Web 应用程序的程序集中,从 C# 后台代码注册变量,以及使用 AJAX 与 C# 服务器端代码进行通信。

Using the Code

要部署 Web 应用程序,只需将 AJAXIntegration.zip 解压缩到 inetpub\wwwroot 目录中。然后使用 IIS 管理单元在 AJAXIntegration 目录上创建一个应用程序。

项目

最常见的 AJAX 应用之一是自动完成文本框。这些功能有助于维护数据完整性,并使输入表单保持相对简洁直观。关键组件来自 http://script.aculo.us/ 的一个出色的 JavaScript 库。该库除了其他实用功能外,还提供了一个优秀的自动完成实现。

关注点

我们首先创建一个 Web 用户控件,其中包含一个 textbox 以及连接 scriptaculous 库所需的装饰和方法。我将 scriptaculous 库直接保存在我的 Web 项目的根目录下,在一个名为 Scriptaculous 的文件夹中。用户控件的 asp.net 代码如下所示:

<asp:TextBox id="TextBox1" runat="server" Width="300px">
    </asp:TextBox>
<div id="TextBoxUpdate" runat="server" style="BORDER: 
    #888 1px solid; DISPLAY: none; WIDTH: 250px; 
    CURSOR: pointer; POSITION: absolute; HEIGHT: 300px; 
    BACKGROUND-COLOR: white"></div>

请注意,这里没有提到 JavaScript。所有的魔力都在后台代码中,在 PreRender 事件中。此事件在生成页面的大部分工作完成后调用。这是注册客户端脚本的合适位置

private void AutocompleteTextBox_PreRender(object sender, 
                                        System.EventArgs e)
{
    this.Page.RegisterArrayDeclaration(
        "Tallan_AutocompleteTextBox","'"+
        SearchBox.ClientID+"','"+SearchBoxUpdate.ClientID+
        "','"+"https:///AJAXIntegration/Fetch.aspx
            ?parameterId="+Parameter+"'");    

    string commonScriptKey = "AutocompleteTextBox";
    if ( !Page
        .IsClientScriptBlockRegistered(commonScriptKey) ) 
    {
        using (System.IO.StreamReader reader = 
                new System.IO.StreamReader(
                typeof(AutocompleteTextBox).Assembly
                .GetManifestResourceStream(typeof(
                AutocompleteTextBox),
                "AutocompleteTextBox.js"))
            )
        {
        // read the script
        String script = "<script language="'javascript'" 
            type='text/javascript' >\r\n<!--\r\n" + 
            reader.ReadToEnd() + "\r\n//-->\r\n</script>";

        // register the script and the init function
        this.Page.RegisterClientScriptBlock(
            commonScriptKey, script);
        this.Page.RegisterStartupScript(commonScriptKey, 
            "<script language="'javascript'" type='text
            /javascript' >\r\n<!--\r\n 
            Tallan_AutocompleteTextBox_Init(); \r\n//-->
            \r\n</script>");
        }
    }
}

这里的关键技术是使用 Page.RegisterArrayDeclarationPage.IsClientScriptBlockRegisteredPage.RegisterClientScriptBlockPage.RegisterStartupScript 来处理 ASP.NET 用户控件的动态性。我的意思是,用户控件可以部署在任何父控件下的任何页面上。因此,其 ID 会根据其所在位置而变化。然而,C# 后台代码可以访问该 ID,即 [some control].ClientId。因此,当脚本注册到页面时,JavaScript 就可以在客户端使用正确的控件进行操作。Page.RegisterArrayDeclaration 方法将在推送到客户端的 HTML 代码中创建一个新的 JavaScript 数组。如果数组已存在,则会向其追加内容。其他 register 方法用于仅在脚本尚未注册时进行注册。当您想在同一页面上使用多个控件时,这将非常有用,就像我在示例中将要做的那样。

以上代码中另一个值得关注的点是如何获取要注册的脚本。在 Page.RegisterStartupScript 调用中,我使用了行内文本,这些文本将按原样写入客户端。然而,在 Page.RegisterClientScriptBlock 中,我使用了 StreamReader 来访问“嵌入资源”。它的工作原理是:创建一个 JavaScript 文件,然后在 Solution Explorer 中右键单击并选择 Properties。在 Build Action 属性中,选择 Embedded Resource 选项。现在,当您编译项目时,该文本文件将可用,如上所示。作为一点补充说明,如果您的 JavaScript 从这些嵌入资源中的更改没有传播到已部署的应用程序,请尝试重新构建项目并重新部署它。这将确保您拥有程序集中最新可用的脚本副本。

注册到页面的 JavaScript 文件 AutocompleteTextBox.js 包含一个初始化方法,该方法在页面启动时由页面调用。正是这个方法将 AJAX 功能分配给 textbox

function Tallan_AutocompleteTextBox_Init() {
    try
    {
        // Make sure the browser supports the DOM calls or 
        // JScript version being used.
        if (!Tallan_AutocompleteTextBox_BrowserCapable()) 
            { return; }
        // instantiate Ajax using the client ids
        for(var i=0;i<Tallan_AutocompleteTextBox.length; 
            i+=3 ){
            new Ajax.Autocompleter(
                Tallan_AutocompleteTextBox[i],
                Tallan_AutocompleteTextBox[i+1], 
                Tallan_AutocompleteTextBox[i+2], { 
                paramName: "search" });
        }
    }
    catch(e){}
}

基本上,整个连接只是实例化一个

new Ajax.Autocompleter

构造函数接受三个参数

  • 需要自动完成的文本框的客户端 ID
  • 将弹出并显示结果的 div 的客户端 ID
  • 一个将返回自动完成选项的资源 URL
  • 用于各种 scriptaculous 选项的参数

最后要讲的是提供自动完成选项的资源。您可以在 scriptaculous 网站上查找相关参数,因为它们会不断发布更新并拥有良好的文档 wiki。

Scriptaculous AJAX 需要一个简单的页面,该页面仅呈现一个 HTML 列表,格式如下:

<ul><li>autocomplete choice 1</li>
<li>autocomplete choice 2</li></ul> 

在这里,我们可以创建一个 aspx 页面(我称之为 Fetch.aspx),将其连接到某个服务器数据源并呈现动态或缓存的自动完成内容。首先,在您的项目中创建一个新的 Web 窗体,并确保删除生成源中除了页面标签之外的所有内容。这包括 form 标签、html 标签,以及所有其他内容。原因是 Internet Explorer 不会显示弹出式自动完成 div,如果页面比简单的 <ul> 列表更复杂的话。然后,您就可以在 Page_Load 事件中编写以下代码了。

string match = Request.Form["search"].ToLower();
Response.Write("<ul>");
foreach( string s in sample )
{
    if( s.ToLower().IndexOf(match) == 0 )
    {
        Response.Write("<li>"+s+"</li>");
    }
}
Response.Write("</ul>");

请注意,我们如何从 Request.Form 对象中获取“search”参数。该参数的名称在 Ajax.Autocompleter 构造函数中配置,该构造函数在上面讨论的 Tallan_AutocompleteTextBox_Init 函数中调用。示例数组只是一个 string[] 示例数据。您可以使用 Select 方法轻松地从 DataTable 获取数据。在 AutocompleteTextBox 控件中,我还包含了一个名为 Parameter 的属性,该属性最终通过查询字符串传递给 Fetch.aspx,例如 https:///AJAXIntegration/Fetch.aspx?parameterId=[Parameter]。您可以通过每个单独的控件通过 Request.QueryString 对象访问此属性以及您希望传递的任何其他属性。

最后一点需要注意的是,SmartNavigation 属性会干扰 InternetExplorer 的异步请求,至少在 scriptaculous 实现方面是这样。因此,在将要使用该控件的任何页面上禁用 SmartNavigation

结论

现在,只需部署代码并亲自尝试一下。您也可以在 Visual Studio 或 Sharp Develop 中打开项目并浏览代码。请记住,您可以通过转到 Tools、Options、Advanced 并取消选中“Disable script debugging”选项来在 Internet Explorer 中启用脚本调试。这样做将允许您在 Scriptaculous 文件夹中的 js 文件中设置断点,并查看异步调用期间发生的情况。为了简洁起见,我没有涵盖完整的实现细节。因此,请不要犹豫提问。

许可证

本文没有明确附加许可证,但可能包含文章文本或下载文件本身的使用条款。如有疑问,请通过下面的讨论区联系作者。作者可能使用的许可证列表可以在 此处 找到。

© . All rights reserved.