想请问:
1.我这样的理解对吗:第一次访问页面是发送一个http请求给服务器,然后服务器发回页面。然后在页面触发一次回发,客户端把表单提交给服务器,因为http是无状态的,所以表单中已被改变的属性值不会被提交,提交到服务器的表单里的控件属性值都是初始值(这里我猜的,请问是不是这样理解的呢??)
2.既然http无状态,为什么输入控件(如textbox)的文本值也可以送到服务器呢??

解决方案 »

  1.   

    看来你是没有理解 HTTP 无状态, 建议看下HTTP 有关的资料
      

  2.   

    搞不明白,但是.NET就是这点比较方便
      

  3.   


    比喻很生动~~~~呵呵~
    但是,“纸上有些表格我可以填,我填了再给你”这句
    例如:有个lable的初始text值为0,如果我按了一个button,把lable的值加1,再按一次button时,提交表单应该不会把为1的text属性值提交给服务器吧??其实我想问的是:提交表单的时候,是不是不能把上次操作改变的属性值(如text属性值被改变为1了)传给服务器,而只能传给服务器属性的初始值呢(把0传给服务器)?
    谢谢
      

  4.   

    是asp.net无状态吧,无状态是页面及控件在服务器端都是重新生成的。
    跟上次请求到的页面是不同的实例。楼主可以看一下asp.net 页生命周期。
      

  5.   

    继续这个比喻
    有个lable的初始text值为0
    楼主这个lable是runat=server的吧,那你也知道它的值是0
    我按了按钮,就是告诉你,把这个lable的值加1
    你知道原来是0所以加了1后返回给我1,当然这时你也知道它的值变成1了
    你那里存着它的值,不用我提交了
      

  6.   

    按照你的逻辑 第一次+1 之后 服务端会把label=1返回给客户端 
    请求的URL相同但是参数不一样
    所以这次 返回的页面不是第一次请求的页面
    第二次按+1 会等于2 的原因是因为html里有记录
      

  7.   


    要知道WEB的本质,不能被ASP.NeT迷惑。实质上服务器不可能存储关于客户端控件的任何状态信息(HTTP是无状态的),要知道服务器面对的是不能预见的客户数量,他要存储谁的?但是MS为了克服这个WEB编程特点,方便我们做代码民工提供了一系列的办法,其中包括视图状态。 无状态是说 当服务器把数据返回给客户端时,服务器上这个过程就算万事了,并不保存任何于此相关的控件状态信息(默认情况),MS是怎么办的地呢,他把控件的状态也随同数据发送给客户端并在表单内形成一个隐藏控件存贮了这些状态信息。提交表单时 你提交了表单内所有控件的数据,包括那个保存了状态的隐藏控件,当然服务器不一定全能去用,用到哪些还是你的代码决定的,点击按钮的过程是,服务器没有存储你的那个0LABEL,而是这个信息包含在客户端的隐藏控件中,并一其提交到了服务器,ASP.NET机制对这个提交上来的隐藏控件中的信息接受并处理得出了LABEL原来的值是1.然后下一个过程 对LABLE的值+1并返回给客户端,把状态又一次写入VIEWSTATE隐藏控件。逻辑上就利用一个再简单不过的隐藏控件克服了一些无状态带来的不便!!方便极了。你可以尝试在PHP或者ASP下实现一个模拟的LABEL然后再给它加1 
      

  8.   

    也就是LABEL的值 并不是存在那里 而是存在咱们这里!
      

  9.   

    因为隐藏控件中保存的是控件从服务器回来时候的状态,如果你对控件进行了操作,比如一个TEXTBOX,本来的值是1,你重新给他写了个值2,当然这个操作还没有让服务器知道VIEWSTATE里面他也是原来的1 所以你要把所有数据都提交 。VIEWSTATE只是让服务器和客户端相互维持控件的状态!不是用来获取控件最新的数据。
      

  10.   

    lz可以用Fiddler 去监控一下网页的提交和接收,你就会很明白的了解.
    到底我们GET/POST给服务器的是什么东西,服务器反馈给我们的是什么东西,以及其中交互的过程是怎么样的.仅仅指交互过程,服务器端后台做的动作客户端是不知道的,客户端在前端做的任何动作在未提交给服务器端,服务器端也是不知道的.
      

  11.   


    <asp:TextBox runat="server" ID="txtName" OnTextChanged="txtName_OnTextChange"></asp:TextBox>&nbsp;
    <asp:Button runat="server" ID="btnSubmit" OnClick="btnSubmit_OnClick" />
    <script runat="server" language="C#" type="text/C#">
    protected void txtName_OnTextChange(object sender,EventArgs e)
    {
          //Do something
    }
    protected void btnSubmit_OnClick(object sender,EventArgs e)
    {
          //Do something
          txtName.Text+="btn test Succeed!";
    }
    </script>1>  Browser输入URL,HTTP通过GET 方式向Server请求数据
    2>  Server 收到URL,通过Page的Init,Load...,UnLoad事件构造页面(包括隐藏控件ViewState),返回给Browser,然后Page这个对象释放在Server上的资源.(PS:Server不可能保存每个请求者的页面信息,HTTP为无状态
    3>  通过Browser填写txtName信息,点击Button
    4>  Browser通过POST方式提交整个页面(包含ViewState控件信息,这个控件包含Server发送到Browser的值)到Server,而txtName的最新值,存储于控件自身
    5>  Server通过Init,Load,然后是处理事件,如:比较ViewState中txtName的值和txtName控件的最新值,如果有不同则在Server触发TextChanged事件,执行txtName_OnTextChange事件处理程序和btnSubmit_OnClick这个Button的时间处理程序,Render,UnLoad,然后释放在Server上的资源,回发Browser