zoukankan      html  css  js  c++  java
  • [翻译]在 ASP.NET 2.0 中高效率地使用 JavaScript Part 1

    Published: 17 Sep 2008
    by Satheesh Babu

    摘要

    .NET Framework 2.0 引入了许多新特性,使得可以简易地在 ASP.NET 页面中使用 JavaScript。 Framework 中的 ClientScriptManager 类有许多新方法,帮助开发者高效地使用这些特性。在这个系列文章的第一部分,Satheesh 讲解 ClientScriptManager 类的频繁使用的重载方法的通用场景(common scenarios) 。他先概览 ClientScriptManager 类,然后结合相关源代码、插图、用法说明来探讨它的三个方法:RegisterClientScriptBlock, RegisterStartupScript, 和 RegisterOnSubmitStatement。

    文章目录
    简介
    ClientScriptManager 类
    RegisterClientScriptBlock() 方法
    RegisterStartupScript() 方法
    RegisterOnSubmitStatement() 方法
    结语


    简介
    [回到顶部]

    JavaScript 是用在 Web 应用程序的功能强大(versatile)的脚本语言(scripting languages )的一种。尽管我们可以在服务器端(server side)用 C# 语言完成所有事情,但我们仍然偏爱用 JavaScript 做某些任务,如验证等。在 ASP.NET 1.x , .Net 框架对 ASP.NET 页面动态地结合(hook) JavaScript 功能没有太多支持。这个弊端在 ASP.NET 2.0 的发布得到解决,提供开发者许多特性来运用 ClientScriptManager 类动态地嵌入 JavaScript 脚本块。我将这篇文章分做两部分,Part 1 结合例子介绍 ClientScriptManager 类的 3 个不同的方法,而 Part 2 将通过一些 ASP.NET 的 JavaScript 技巧来探讨剩下的方法 。

    ClientScriptManager 类
    [回到顶部]

    我们通常以 <Script> 标签添加 JavaScript 函数到页面。某些情况下我们需要从 codebehind 类中动态地添加脚本,在 .NET Framework 1.x 版本中,没有库类可以帮助我们有效地处理这种情况。这个缺点被 .NET Framework 2.0 引入一个新类 ClientScriptManager 解决了。这个类可以用来从 codebehind 类管理和增加脚本块到 asp.net 页面。

    Things we should know about ClientScriptManager Class

    关于 ClientScriptManager 类,我们应该了解的东西

    ClientScriptManager 类
     
    Page 对象的 ClientScript 属性是 ClientScriptManager 类的实例,通过它我们可以动态地添加脚本嵌入到 HTML 输出中。

    该类用关键字 key 和类型 type 唯一识别脚本,相同关键字和类型的脚本被看作重复(duplicates),相同的脚本应该避免。这样当我们在用户控件添加脚本时,可以避免混乱发生。例如,方法 IsClientScriptBlockRegistered() 可以用来检测脚本被 RegisterClientScriptBlock() 重复注册。

    类 ClientScriptManager 有一系列有用的方法,可用来注入 JavaScript 函数到 HTML 输出中。我们可以依情况选择这些方法来解决我们的需求。

    这部分文章将讨论下面 3 个方法的用法:
    1. RegisterClientScriptBlock() 方法
    2. RegisterStartupScript() 方法
    3. RegisterOnSubmitStatement() 方法

    RegisterClientScriptBlock()  方法
    [回到顶部]

    .NET Framework 1.x 中的Page.RegisterStartUpScript() 和 Page.RegisterClientScriptBlock() 方法已经废弃,这两个方法已经封装在 ClientScriptManager 类中,方法 RegisterClientScriptBlock()允许您将 Javascript 函数插入到页面的顶部,当首次访问此页面时运行(浏览器加载页面的时候)。ClientScriptManager 类还有有一个 IsClientScriptBlockRegistered() 方法,当脚本块已经用同样的 key 注册时返回 true, 这样,我们可以防止脚本重复注册。


    该方法有两个重载

    Listing 1 - RegisterClientScriptBlock Overloads

    ClientScriptManager.RegisterClientScriptBlock (Type typeofscript, String key,
    String script)
    ClientScriptManager.RegisterClientScriptBlock (Type typeofscript, String key,
    String script, Boolean addScriptTags)


    将下面代码放在 page load 或 button click 里面,在页面加载或随后的 postback 时执行。

    Listing 2 - 1st overload

    ClientScriptManager script = Page.ClientScript;
    if (!script.IsClientScriptBlockRegistered(this.GetType(), "Alert"))
    {
        script.RegisterClientScriptBlock(this.GetType(), "Alert",
            "<script type=text/javascript>alert('hi')</script>");
    }

    Listing 3 - 2nd overload

    ClientScriptManager script = Page.ClientScript;
    if (!script.IsClientScriptBlockRegistered(this.GetType(), "Alert"))
    {
        script.RegisterClientScriptBlock(this.GetType(), "Alert", "alert('hi')",true);
    }

    Figure 1 - RegisterClientScriptBlock Output

    正如我前面所说,页面加载时这些方法内的脚本会执行,所以在控件实际呈现之前,我们可以看见 alert 弹出框。


    RegisterStartupScript() 方法
    [回到顶部]

    这节里,我们看看 ClientScriptManager 类的 RegisterStartupScript() 方法。RegisterStartupScript()方法和RegisterClientScriptBlock()方法都会注入 Jscript 代码,在随后的 postback 执行。但实际的区别是后者(原文为former,疑为有误)会在 form 起始标签之后控件之前注入脚本,而RegisterStartupScript() 方法会在控件之后 form 结束标签之前注入脚本。这意味着使用 RegisterClientScriptBlock() 方法注入的脚本,不能访问页面的控件;然而,使用 RegisterStartupScript()方法则可以。

    下面的标记(Listing 4 and 5) 展示 ASP.NET 执行 RegisterClientScriptBlock() 和 RegisterStartupScript() 方法后的 html 输入块。

    Listing 4 - RegisterClientScriptBlock Output

    <form name="form1" method="post" action="Default.aspx" id="form1">
    <div>
    <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE"
    value="/wEPDwUJMjgzMDgzOTgzZGQfI8LfDKmcT0TXZj8jwrxqI6TOIA==" />
    </div>
    <script type=text/javascript>alert('hi')</script>


    从上面的 HTML 代码段,我们可以看到脚本嵌入到页面的控件之前,而在 form 开始标签之后。

    Listing 5 - RegisterStartupScript Output

    <script type="text/javascript">
    <!--
    alert(document.getElementById('txtName').value)// -->
    </script>
    </form>
    </body>


    从上面的 HTML 代码段(Listing 5),我们可以看到脚本块嵌入到页面控件之后,而在 form 结束标签之前,这样如我前面所说,使得脚本可以访问页面控件。


    重载

    这个方法有两个重载

    Listing 6 - RegisterClientScriptBlock Overloads

    ClientScriptManager.RegisterClientScriptBlock (Type typeofscript, String key,
    String script)
    ClientScriptManager.RegisterClientScriptBlock (Type typeofscript, String key,
    String script, Boolean addScriptTags)

    用法

    将下面代码放在 page load 或 button click 里,使代码在加载或随后的 postback 时执行。就像 RegisterClientScriptBlock()方法,这个方法同样有一个叫做 IsStartupScriptRegistered()的方法,可以检测脚本重复注册。参考下面 RegisterStartupScript()方法实现的代码。

    Listing 7 - 1st overload

    ClientScriptManager script = Page.ClientScript;
    txtName.Text = "Welcome to AspAlliance!!!";
    if (!script.IsStartupScriptRegistered (this.GetType(), "Alert"))
    {
        script.RegisterStartupScript (this.GetType(), "Alert",
            "<script type=text/javascript>alert(document.getElementById('txtName').value)</script>");
    }

    Listing 8 - 2nd overload

    ClientScriptManager script = Page.ClientScript;
    txtName.Text = "Welcome to AspAlliance!!!";
    if (!script.IsStartupScriptRegistered (this.GetType(), "Alert"))
    {
        script.RegisterStartupScript (this.GetType(), "Alert",
            "alert(document.getElementById('txtName').value)",true);
    }


    当上面代码执行时,我们得到类似于"Figure 2 - RegisterStartupScript Output" 的输出。

    Figure 2 - RegisterStartupScript Output


    这里,页面的控件呈现之后,脚本块就执行,并且与 RegisterClientScriptBlock() 相反,页面的控件对脚本块可见,参看上面的例子。这样使用 RegisterStartupScript() 方法注册脚本,我们可以访问页面的控件。


    RegisterOnSubmitStatement() 方法
    [回到顶部]

    这节将讨论 ClientScriptManager 类的 RegisterOnSubmitStatement()方法的实现。有时我们在提交表单到服务器之前有验证的需求。例如,某个输入域,存储数据到数据库之前,我们可能需要得到客户的确认,不能通过验证方法判断有效性 。此时,这个方法可以派上用场,提供确认对话框。这个方法注册的脚本在页面提交的时候执行。

    Listing 9 - 语法

    public void RegisterOnSubmitStatement (
        Type type,
        string key,
        string script
    )

    用法

    将下面代码放于 page load 中,使页面表单每次提交之时都执行脚本。

    Listing 10 - RegisterOnSubmitStatement

    if (!script.IsClientScriptBlockRegistered(this.GetType(), "SubmitScript"))
    {
        script.RegisterOnSubmitStatement(this.GetType(), "SubmitScript",
        "alert('Submit Clicked')");
    }


    考虑下面代码:

    Listing 10 - RegisterOnSubmitStatement Example

    protected void Page_Load(object sender, EventArgs e)
    {    
      ClientScriptManager script = Page.ClientScript;
      if (!script.IsClientScriptBlockRegistered(this.GetType(), "SubmitScript"))
        {
            script.RegisterOnSubmitStatement(this.GetType(), "SubmitScript", "return
            confirm('Are you sure to continue')");
        }
    }
    protected void btnSubmit_Click(object sender, EventArgs e)
    {
        Response.Write("Form is Submitted.");
    }


    执行上面代码会生成一个 webform, 点击提交会产生一个像下面图片的确认框

    Figure 3 - RegisterOnSubmitStatement Output 1

    点击 Cancel 不会触发 submit 点击事件,而点击 OK 则会,输出如 Figure 4

    Figure 4 - RegisterOnSubmitStatement Output 2


    结语
    [回到首页]

    这样,我们通过这篇文章,我们掌握了 .NET Framework 2.0 提供的非常实用的的一个特性子集。基于业务需求要处理一些 JavaScript 代码块,或在 HTML 输出中简易地编程来添加 JavaScript 代码块,这些方法提供了良好的灵活性。在下载小节下载关联这篇文章的源代码,看看实际效果。这篇文章的 Part 2 将讨论 ClientScriptManager 类的其它方法和一些 JavaScript 技巧。

    Happy Coding!!


    参考

    ClientScriptManager Class

    Downloads

    [下载源代码]


    原文:Using JavaScript Effectively in ASP.NET 2.0 - Part 1
    http://aspalliance.com/1701_Using_JavaScript_Effectively_in_ASPNET_20__Part_1.all


     
  • 相关阅读:
    《失业的程序员》(十):分歧的产生
    《失业的程序员》(九):创业就是一场戏
    使用MySQL处理百万级以上数据时,不得不知道的几个常识
    《失业的程序员》(八):创业的要素
    《失业的程序员》(七):梦想和胸襟-正文
    《失业的程序员》(六):加班
    《失业的程序员》(五):商战之前
    《失业的程序员》(四):关于猪刚烈
    《失业的程序员》(二):酒后的第一桶金
    《失业的程序员》(三):口才帝和表情帝
  • 原文地址:https://www.cnblogs.com/feixian49/p/1325944.html
Copyright © 2011-2022 走看看