//注意,不是服务器读取网页,而是浏览器收集在表单中填写的字段,然后提交数据,

//给服务器来处理,由于没有把div当前的innertext发给服务器,所以服务器不能得知当前的值

//也不要幻想有办法能将div的innertext提交给服务器,因为只有设定了name的input,textarea

//select的value属性值才会被提交给服务器,只针对前面input,textarea,select这几个控件才能提交数据

---------------------------------------

上面意思是:的只有表单元素才能提交给后台,表单元素也只有value属性的值可以提交给服务器

比如表单的宽度:

---------------------------------------

下面做一个text框,实现,点击一下就把它的宽度+1

----------------------------------------------------

通过webform来实现:

在原来的项目:

/WebSiteTest

中添加:

宽度自增.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="宽度自增.aspx.cs" Inherits="宽度自增" %>



<!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>

    <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>

    <asp:Button ID="Button1" runat="server" οnclick="Button1_Click" Text="Button" />

    </form>

</body>

</html>

-------------------------------------

可以看到跑出来的html代码:

<!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><title>



</title></head>

<body>

    <form method="post" action="./宽度自增.aspx" id="form1">

     //<form method="post" action="./宽度自增.aspx" id="form1">

     //从这句看出来webform都是post方法提交数据,要想做成get是做不到的

     //但是做成post会有一个问题就是重复提交表单的时候,浏览器会有提示

     //效果很不好

<div class="aspNetHidden">

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTI2NTY4ODI3MQ9kFgICAw9kFgICAQ8PFgIeBFRleHQFATBkZGRIR372XDyVmQEoCsxYtJpuAGKXGmbc4njPiVM89RA1eA==" />

</div>

<div class="aspNetHidden">

<input type="hidden" name="__VIEWSTATEGENERATOR" id="__VIEWSTATEGENERATOR" value="E122DF2E" />

<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEdAAL7fTNzc+icJ05GwTvptJcwzfg78Z8BXhXifTCAVkevd7aVIvFI8otZQHyY11S+O9C5WITd4ECgLaZ2I1ZtOVYu" />

</div>

    <div>

    </div>

    <span id="Label1">0</span>//这里服务器控件<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>被转换成了span控件

    <input type="submit" name="Button1" value="Button" id="Button1" />

    </form>

</body>

</html>

-----------------------------------------------------

在看看,aspx的cs文件:

宽度自增.aspx.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;



public partial class 宽度自增 : System.Web.UI.Page

{

    protected void Page_Load(object sender, EventArgs e)

    {

        if(!IsPostBack ){//直接进入的时候设置为0

            Label1.Text = "0";

            //IsPostBack这里的IsPostBack就是,以前讲的通过隐藏字段传递的

        }

    }

    protected void Button1_Click(object sender, EventArgs e)

    {//取到label的值,然后自增后赋值回去

        int i = Convert.ToInt32(Label1.Text);

            i++;

            Label1.Text = i.ToString();

    }

}

-----------------------------------------------------

//从上面的生成的html源码中可以看到:

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTI2NTY4ODI3MQ9kFgICAw9kFgICAQ8PFgIeBFRleHQFATBkZGRIR372XDyVmQEoCsxYtJpuAGKXGmbc4njPiVM89RA1eA==" />

这样的一个代码:

__VIEWSTATE

这个就是ViewState代码:

__VIEWSTATE就是存下次需要用到的代码,数据

什么是viewState: viewState其实就是用来存放[那些没有name 属性的表单] 数据的一个容器。

这里的/wEPDwUKMTI2NTY4ODI3MQ9kFgICAw9kFgICAQ8PFgIeBFRleHQFATBkZGRIR372XDyVmQEoCsxYtJpuAGKXGmbc4njPiVM89RA1eA==

是经过编码后的数据,可以用:ViewStateDecoder2这个工具来进行解析

---------------------------------------------------------------

可以看下解析结果:

<?xml version="1.0" encoding="utf-16"?>

<viewstate>

  <Pair>

    <Pair>

      <String>1265688271</String>

      <Pair>

        <ArrayList>

          <Int32>3</Int32>

          <Pair>

            <ArrayList>

              <Int32>1</Int32>

              <Pair>

                <Pair>

                  <ArrayList>

                    <IndexedString>Text</IndexedString>

                    <String>5</String>//这里就是需要提交给后台,被viewstate封装的值

                  </ArrayList>

                </Pair>

              </Pair>

            </ArrayList>

          </Pair>

        </ArrayList>

      </Pair>

    </Pair>

  </Pair>

</viewstate>

---------------------------------------------

关于另外两个字段的意思:

asp.net页面里__VIEWSTATEGENERATOR、__EVENTVALIDATION是做什么用的

服务器返送给浏览器的页面里,有这两个隐藏域,还有对应的数值。感觉,既然呈现给我们,似乎就有用,但不知道有什么用?

------解决思路----------------------

如果你学习 asp.net 控件开发技术,就会了解这个其实是核心技术。

asp.net 要给程序员提供一个类似 winform 的自动保持所有控件(包括内部子控件)

的成千上万状态的机制,不需要程序员自己来开发(例如自己再胡乱写什么隐藏域来保存

和提交)状态维系机制。当页面提交(回发)时,例如GridView上的所有数据行、每一行

内的所有自定义模板中的子控件等等,你会看到状态都自动重新填好了(哪怕你修改了

GridView中某一行的模板中的一个Label的ForeColor属性),这就是靠着网页的ViewState保

存着所有控件的状态值。而当用户在浏览器端点击一些操作,例如点击GridView中的“编辑”按

钮,页面并不仅仅触发这个Button_Click事件,还要触发Grid的一个Edit事件,等等这类事件,

也需要从客户端传给服务器端。

因此 PostData + Event 这两种机制和相关的数据,构成了 asp.net webform 的核心技术。

而传统的 web 服务器上有数百个网站,所以asp.net 设计者不用 web 服务器来保存这些数据,

而是在页面 html 文本中“夹带”这些信息,随着html的输出而输出,

随着 <form /> 的提交而带回,把浏览器端页面当作这些数据的一个存储载体

----------------------------------------------------------------

再看另一个例子:

这个例子,用一个text框来实现自增:

新建一个webform

/WebSiteTest

Input自增.aspx

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

<!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>

        <asp:TextBox ID="TextBox1" runat="server">0</asp:TextBox>

        <asp:Button ID="Button1" runat="server" οnclick="Button1_Click" Text="Button" />


    </div>

    </form>

</body>

</html>

--------------------------------------------------------------

Input自增.aspx.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;



public partial class Input自增 : System.Web.UI.Page

{

    protected void Page_Load(object sender, EventArgs e)

    {

        if (!IsPostBack)

        {//直接进入的时候设置为0

            TextBox1.Text = "0";

            //IsPostBack这里的IsPostBack就是,以前讲的通过隐藏字段传递的

        }

    }

    protected void Button1_Click(object sender, EventArgs e)

    {

        //取到label的值,然后自增后赋值回去

        int i = Convert.ToInt32(TextBox1.Text);

        i++;

        TextBox1.Text = i.ToString();

    }

}

-------------------------------------------------------------

可以看到这个代码生成的html:

http://localhost:53627/WebSiteTest/Input%E8%87%AA%E5%A2%9E.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><title>

</title></head>

<body>

    <form method="post" action="./Input自增.aspx" id="form1">

<div class="aspNetHidden">

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKLTk3NjEyMzEzNGRk71NHMDbsieJOLOdeJmYLqrtiqKqPjnKQmqvtOr2bJJg=" />

</div>



<div class="aspNetHidden">



<input type="hidden" name="__VIEWSTATEGENERATOR" id="__VIEWSTATEGENERATOR" value="7E546094" />

<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEdAANZZumKrLz+OL/EwCGB3tXZESCFkFW/RuhzY1oLb/NUVM34O/GfAV4V4n0wgFZHr3eF8Ql+dUaHsiGgF7F383duzhWY03+dhzN926S9tRsTVg==" />

</div>

    <div>


        <input name="TextBox1" type="text" value="3" id="TextBox1" />

        <input type="submit" name="Button1" value="Button" id="Button1" />


    </div>

    </form>

</body>

</html>

--------------------------------------------------------

这个时候再去给这个:

__VIEWSTATE利用工具去解码:

可以看到:

/wEPDwUKLTk3NjEyMzEzNGRk71NHMDbsieJOLOdeJmYLqrtiqKqPjnKQmqvtOr2bJJg=

这个值,并没有被解码出,在inputbox中输入的值:

<?xml version="1.0" encoding="utf-16"?>

<viewstate>

  <Pair>

    <Pair>

      <String>-976123134</String>

    </Pair>

  </Pair>

</viewstate>

------------------------------------------

这是因为input本身就是一个表单控件,是不需要封装,就可以传值给服务器端的

-------------------------------------------------------------------------

下一个知识点:

宽度自增.aspx

中除了原来的label自增,再添加一个textbox

这次除了要实现textbox自增还要实现同时,自增textbox框的宽度:

----------------------

修改:宽度自增.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="宽度自增.aspx.cs" Inherits="宽度自增" %>



<!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>

    <style type="text/css">

        #form1

        {

            height: 70px;

        }

    </style>

</head>

<body>

    <form id="form1" runat="server">

    <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>

    <asp:Button ID="Button1" runat="server" οnclick="Button1_Click" Text="Button" />

    <div>    <asp:TextBox ID="TextBox1" runat="server">0</asp:TextBox>

        <asp:Button ID="Button2" runat="server" οnclick="Button2_Click" Text="Button" />

    </div>



    </form>

</body>

</html>

----------------------------------------------------------------

宽度自增.aspx.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;



public partial class 宽度自增 : System.Web.UI.Page

{

    protected void Page_Load(object sender, EventArgs e)

    {

        if(!IsPostBack ){//直接进入的时候设置为0

            Label1.Text = "0";

            //IsPostBack这里的IsPostBack就是,以前讲的通过隐藏字段传递的

        }

    }

    protected void Button1_Click(object sender, EventArgs e)

    {//取到label的值,然后自增后赋值回去

        int i = Convert.ToInt32(Label1.Text);

            i++;

            Label1.Text = i.ToString();

    }



    protected void Button2_Click(object sender, EventArgs e)

    {

        //值自增

        int i = Convert.ToInt32(TextBox1.Text);

        i++;

        TextBox1.Text = i.ToString();

        //宽度自增

        //TextBox1 .Width.Type  = UnitType.Pixel;

        //通过上面这个代码可以看到:

        //这个宽度的单位是unit

        TextBox1.Width = new Unit(TextBox1 .Width .Value +10);

        //每次都增加十个像素

    }

}

--------------------------------------------------------------------

这个时候生成的html可以看下:

<!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><title>



</title>

    <style type="text/css">

        #form1

        {

            height: 70px;

        }

    </style>

</head>

<body>

    <form method="post" action="./宽度自增.aspx" id="form1">

<div class="aspNetHidden">

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKLTQ4ODQ4Nzc5OQ9kFgICAw9kFgQCAQ8PFgIeBFRleHQFATBkZAIFDw8WBB4FV2lkdGgbAAAAAAAAVEABAAAAHgRfIVNCAoACZGRkXGCqNajh4IuVyWymZyo4x40WfdVX5AkTrkfRIik/Rig=" />

</div>



<div class="aspNetHidden">



<input type="hidden" name="__VIEWSTATEGENERATOR" id="__VIEWSTATEGENERATOR" value="E122DF2E" />

<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEdAAQ2CRyaPRPldKknavZGjVRTzfg78Z8BXhXifTCAVkevdxEghZBVv0boc2NaC2/zVFQ/WMskeKo19Gyidl+m11dTbupdj64bs2PAn7f7VplzH8gtEYkEb8aSePQq3p1gkhE=" />

</div>

    <span id="Label1">0</span>

    <input type="submit" name="Button1" value="Button" id="Button1" />

    <div>    <input name="TextBox1" type="text" value="8" id="TextBox1" style="width:80px;" />

        <input type="submit" name="Button2" value="Button" id="Button2" />

    </div>



    </form>

</body>

</html>



----------------------------------------------------------------

这时候用工具解码:

__VIEWSTATE

------------

/wEPDwUKLTQ4ODQ4Nzc5OQ9kFgICAw9kFgQCAQ8PFgIeBFRleHQFATBkZAIFDw8WBB4FV2lkdGgbAAAAAAAAVEABAAAAHgRfIVNCAoACZGRkXGCqNajh4IuVyWymZyo4x40WfdVX5AkTrkfRIik/Rig=

----------------------------------------------------------------------------------------------------------

可以看到:

<?xml version="1.0" encoding="utf-16"?>

<viewstate>

  <Pair>

    <Pair>

      <String>-488487799</String>

      <Pair>

        <ArrayList>

          <Int32>3</Int32>

          <Pair>

            <ArrayList>

              <Int32>1</Int32>

              <Pair>

                <Pair>

                  <ArrayList>

                    <IndexedString>Text</IndexedString>

                    <String>0</String>

                  </ArrayList>

                </Pair>

              </Pair>

              <Int32>5</Int32>//

              <Pair>

                <Pair>

                  <ArrayList>

                    <IndexedString>Width</IndexedString>

                    <Unit>80px</Unit>//这个地方存了文本框的宽度可以看到

                    <IndexedString>_!SB</IndexedString>

                    <Int32>256</Int32>

                  </ArrayList>

                </Pair>

              </Pair>

            </ArrayList>

          </Pair>

        </ArrayList>

      </Pair>

    </Pair>

  </Pair>

</viewstate>

可以看到textbox宽度被viewstate传到后台去了