• 使用 HtmlInputHidden 控件在本页面保持状态和跨页面传值


     
     
    使用 HtmlInputHidden 控件在本页面保持状态和跨页面传值 
     

          
           

     
     
    一、使用 HtmlInputHidden 控件在本页面保持状态,并讨论在生成页面后通过 JavaScript 获取由HtmlInputHidden 控件生成的隐藏文本值。

        先说说在本页面保持状态,我们一般采用 ViewState 可以在同一页的多个请求间保存和还原服务器控件的视图状态,这种用法一般在服务器端使用。但是如果我们需要在生成页面后(也就是说要在客户端中)的 JavaScript 函数需要使用页面保持状态的值,我们可以将这类值在服务器端处理过程中放到隐藏文本框中,然后在 JavaScript 函数中来获取隐藏文本值。

       范例分别通过使用 html 服务器控件和 web 服务器控件来演示。

       先简单说说 html 服务器控件和 web 服务器控件的区别。

       HTML 服务器控件,服务器公开的 HTML 元素,可以通过添加 runat="server" 属性表明应将 HTML 元素作为服务器控件进行处理,还可以设置元素的 id 属性,可以通过编程方式引用控件,可以通过设置属性 (Attribute) 来声明服器控件实例上的属性 (Property) 参数和事件绑定。HTML 服务器控件公开一个对象模型,该模型十分紧密地映射到相应控件所呈现的 HTML 元素。[1]

        Web 服务器控件,它比 HTML 服务器控件具有更多内置功能。Web 服务器控件不仅包括窗体控件(例如按钮和文本框),而且还包括特殊用途的控件(例如日历、菜单和树视图控件)。Web 服务器控件与 HTML 服务器控件相比更为抽象,因为其对象模型不一定反映 HTML 语法。[1]
    (1)使用 html服务器控件演示

    Test.aspx 代码如下:

    <%...@ Page Language="C#" AutoEventWireup="true" CodeFile="Test.aspx.cs" Inherits="Test" %>

    <!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>
        <input id="HiddenValue" type="hidden" value="初始化的值为空" runat="server"/>
            <br />
            <input id="txtTestValue" type="text" runat="server"/><br />
            <span id="Span1" runat="server">
               标签:用来显示上一次隐藏文本框的值,完成保持页面状态的值功能<br />
            </span>
            <input id="Submit1" type="submit" value="改变隐藏文本的值" runat="server" onserverclick="Submit1_ServerClick"/>
            <input id="Button2" onclick="GetHideValue();" type="button" value="获得隐藏文本的值" /></div>
        </form>
    </body>
    </html>
    Test.aspx.cs 代码如下:

     

    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;

    public partial class Test : System.Web.UI.Page
    ...{
        protected void Page_Load(object sender, EventArgs e)
        ...{
            string csName = "TextScript";
            Type csType = this.GetType();
            ClientScriptManager cs = Page.ClientScript;

            // 检查是否脚本是否已经被注册
            if (!cs.IsStartupScriptRegistered(csType, csName))
            ...{
                string csText = @"function GetHideValue()
                    {                  
                        var obj = document.getElementById(""" + HiddenValue.ClientID + @""");
                        var str = obj.value;
                        alert(str);                            
                    }";
                cs.RegisterStartupScript(csType, csName, csText, true);
            }
            if (Page.IsPostBack)
            ...{
                Span1.InnerHtml = "保存上一次的值: <b>" +
                                HiddenValue.Value + "</b>";
            }
        }
        protected void Submit1_ServerClick(object sender, EventArgs e)
        ...{
            HiddenValue.Value = txtTestValue.Value;
        }
    }

    (2)使用 web 服务器控件来演示

    TestWebControl.aspx 代码如下:


    <%...@ Page Language="C#" AutoEventWireup="true" CodeFile="TestWebControl.aspx.cs" Inherits="TestWebControl" %>

    <!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>
            <input id="HiddenValue" runat="server" type="hidden" value="初始化的值为空" /><br />
            <asp:TextBox ID="txtTestValue" runat="server"></asp:TextBox><br />
            <span id="Span1" runat="server">标签:用来显示上一次隐藏文本框的值,完成保持页面状态的值功能.</span><br />
            <asp:Button ID="Button1" runat="server" Text="改变隐藏文本的值" OnClick="Button1_Click" />
            <input id="Button2" type="button" value="获得隐藏文本的值" onclick="GetHideValue();" />
        </div>
        </form>
    </body>
    </html>
    TestWebControl.aspx.cs 代码如下:

    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;

    public partial class TestWebControl : System.Web.UI.Page
    ...{
        protected void Page_Load(object sender, EventArgs e)
        ...{
            string csName = "TextScript";
            Type csType = this.GetType();
            ClientScriptManager cs = Page.ClientScript;

            // 检查是否脚本是否已经被注册
            if (!cs.IsStartupScriptRegistered(csType, csName))
            ...{
                string csText = @"function GetHideValue()
                    {                  
                        var obj = document.getElementById(""" + HiddenValue.ClientID + @""");
                        var str = obj.value;
                        alert(str);                            
                    }";
                cs.RegisterStartupScript(csType, csName, csText, true);
            }
            if (Page.IsPostBack)
            ...{
                Span1.InnerHtml = "保存上一次的值: <b>" +
                                HiddenValue.Value + "</b>";
            }
        }

        protected void Button1_Click(object sender, EventArgs e)
        ...{
            HiddenValue.Value = txtTestValue.Text;
        }
    }
     

    二、使用 HtmlInputHidden 控件跨页面传值

         通过指定服务器控件 Button 的 PostBackUrl属性可以提交到指定的页面。在该方式下,既然提到跨页面传值,除了使用 HtmlInputHidden 控件跨页面传值,范例中还提供其他四种传值方式!非通过指定服务器控件 Button 的 PostBackUrl属性跨页面传值的其他方式见:http://blog.csdn.net/scucj/archive/2006/07/17/932884.aspx

    源页面:

    FormerPage.aspx 代码如下:

    <%...@ Page Language="C#" AutoEventWireup="true" CodeFile="FormerPage.aspx.cs" Inherits="FormerPage" %>

    <!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>
            <input id="HiddenValue" runat="server" type="hidden" value="初始化的值为空" /><br />
            <asp:TextBox ID="txtTestValue" runat="server"></asp:TextBox><br />
            <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" PostBackUrl="~/DestinationPage.aspx"
                Text="改变隐藏文本的值" />&nbsp;</div>
        </form>
    </body>
    </html>
    FormerPage.aspx.cs 代码如下:

    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;

    public partial class FormerPage : System.Web.UI.Page
    ...{
        public string TestValue
        ...{
            get
            ...{
                return this.txtTestValue.Text;
            }
        }

        protected void Page_Load(object sender, EventArgs e)
        ...{
           
        }
        protected void Button1_Click(object sender, EventArgs e)
        ...{
            HiddenValue.Value = txtTestValue.Text;

            ArrayList myList = new ArrayList(3);//创建动态数组
            myList.Add("Hello,Array1! ");//向动态数组中添加新的值
            myList.Add("Hello,Array2!");
            myList.Add("Hello,Array3!");
            //Context可保存任意数据类型,Context字典特定于某个Http请求。
            //对于不同客户端,值是不一样的。
            Context.Items["destinationList"] = myList;//在Context.Items中保存动态数组

            Context.Items.Add("newContext", "Hello,NewContext");//在Context.Items中保存一组名称-值的数据
        }
    }
    目标页面:

    DestinationPage.aspx 代码如下:


    <%...@ Page Language="C#" AutoEventWireup="true" CodeFile="DestinationPage.aspx.cs" Inherits="DestinationPage" %>
    <%...@ PreviousPageType VirtualPath="~/FormerPage.aspx" %>
    <!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>
       
        </div>
        </form>
    </body>
    </html>

    DestinationPage.aspx.cs 代码如下:


    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;

    public partial class DestinationPage : System.Web.UI.Page
    ...{
        protected void Page_Load(object sender, EventArgs e)
        ...{
            if (Page.PreviousPage != null)
            ...{
                //通过隐藏文本框传递值
                HtmlInputHidden htmlInputHidden = (HtmlInputHidden)Page.PreviousPage.FindControl("HiddenValue");
                if (htmlInputHidden != null)
                ...{
                    string htmlInputHiddenValue = htmlInputHidden.Value;
                    Response.Write("<script language='javascript'>alert('传递过来的值:" + htmlInputHiddenValue  + "');</script>");
                }
                //通过服务器控件传递值
                TextBox tb  = (TextBox)Page.PreviousPage.FindControl("txtTestValue");
                if (tb != null)
                ...{
                    string testValue1 = tb.Text;
                }
               
                string testValue2 = PreviousPage.TestValue;//通过属性跨页面传递值
                string contextItemsValue = Context.Items["newContext"].ToString();//通过FormerPage中Context的Items获取值
                ArrayList listResult = (ArrayList)Context.Items["destinationList"];//通过FormerPage中Context的Items获取对象,强制转换类型:

            }
        }
    }
     

    该文章转载自网络大本营:http://www.xrss.cn/Dev/DotNet/2007101717009.Html

  • 相关阅读:
    HeadFirst设计模式C++实现-AbstractFactory模式
    Head First设计模式C++实现Singleton模式
    系统程序员成长计划动态数组(三)(上)
    一种OPENSSL_Uplink(100F2010,05): no OPENSSL_Applink解决方法
    系统程序员成长计划动态数组(四)
    Head First设计模式C++实现Command模式
    EJB>事务管理服务 小强斋
    EJB>事务管理服务 小强斋
    EJB>实体继承 小强斋
    EJB>事务管理服务 小强斋
  • 原文地址:https://www.cnblogs.com/jackrebel/p/1094872.html
Copyright © 2020-2023  润新知