ASP.NET WebForm 05 常用对象1

Posted by 卢华源 on July 17, 2019

1 页面回发处理

1.1 预期效果

文本框中的数据在点击按钮之后怎样发送到服务器的

ASP.NET 服务器控件中按钮默认都是submit类型,能够提交表单
_VIEWSTATE 这个隐藏域就是用来将页面的控件状态保存起来,并且在服务器端和客户端反复传递

1.2 网页首次加载和回发加载的时机

  • Page_Load始终首先被执行

  • 其他事件是第二次加载

1.2.1 理解回发

  • 产生的时机:当用户操作让表单产生submit时产生回发
  • 原理分析:当前网页被提交给服务器处理时,服务器会对当前网页再次加载(重新绘制)
  • Load事件:不管是首次加载,还是回发,网页都会激发load事件

    那么可以在load事件中对网页内容初始化吗? 出现了不理想的结果
    如何改进? 所以记住以下代码: ```c#

    protected void Page_Load(object sender,EventArgs e){ if(Page.isPostBack)//首次加载 { this.txtNum1.Text = “请输入内容!”; }else//回发 { this.txtNum2.Text = this.txtNum1.Text; } }

    ```

2 Page对象

2.1 关于Page对象

  • 每个aspx文件对应一个Page对象
  • .aspx页面与后台代码类(局部类)合并生成页面类
  • Page对象是页面类的实例
  • 所有的.aspx文件(Web窗体叶)都继承自System.Web.UI.Page类

2.2 回顾@Page指令

2.3 Page对象的属性和事件

属性 说明
IsPostBack 是否首次加载
Request 当前页请求对象
Response 当前页响应对象
Load 当服务器控件加载到Page对象时发生

当使用Page对象的属性时,Page可以省略

3 请求与响应

3.1 产生的时机

3.2 本质

  • Request 对象时HTTPRequest对象,在页面类中自动创建
  • Request 对象封装了用户的请求信息(用户输入的信息或者URl中携带的信息)
  • Response 对象封装服务器的响应信息

3.3 Request对象

Request对象如何获取传递过来的数据

  • QueryString属性(查询字符串):获取通过URL路径传来的数据

    ...
    string name = Request.QueryString["name"];
    string age = Request.QueryString["age"];
    Response.Write("姓名="+name+"年龄"+age);
    ...
    

    然而 输出的结果的代码时这样的: 记住Response.Write()的特性

  • Form属性(表单数据):通过表单提交传输的数据
  • ServerVariables属性:获取Web服务器变量的集合

  • Params属性:以上三种传输方式都可以通过这种方式获取

3.4 Response对象

用作操作页面的输出流

  • Write方法

直接在页面上输出内容(在页面输出的最顶端输出)

  • Redirect方法

重定向到另一个页面(通过后台程序控制页面跳转)

4 ViewState对象

4.1 使用场景

如果在服务器端定义一个变量,需要在客户端不同时刻的请求可以累计或参与其他计算

正常情况下,客户端每发出一次请求,成员变量会重新初始化一次
所以此变量无法参与客户端的计算
如何解决?
ViewState

4.2 举例

4.2.1 不使用ViewState

新建项目,目录结构如下:

其中Default.aspx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace ASP.NETDemo03
{
    public partial class Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
           
        }

        int counter = 0;

        protected void btnCal_Click(object sender, EventArgs e)
        {
            
            this.ItaCounter.Text = counter.ToString();
            
        }
    }
}

其中Default.aspx代码如下:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="ASP.NETDemo03.Default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            按钮计数器:<br />
            <asp:Button ID="btnCal" runat="server" Text="点击我啊" OnClick="btnCal_Click" />
            <hr />
            您单机了
            <asp:Literal ID="ItaCounter" runat="server"></asp:Literal>            
            次:

        </div>
    </form>
</body>
</html>

这种情况下点击时,第一次点击会出现1,但是之后每次点击都是1

4.2.2 使用ViewState

  • 将上例中的Default.aspx.cs的代码改为如下所示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace ASP.NETDemo03
{
    public partial class Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                ViewState["counter"] = 0;
            }
        }



        protected void btnCal_Click(object sender, EventArgs e)
        {
            int counter = (int)ViewState["counter"];
            counter++;
            this.ItaCounter.Text = counter.ToString();
            ViewState["counter"] = counter;
        }
    }
}


之后再运行,可以看到可以如愿累计: