比如TextBox一定会回传,而Lable不会,
而Asp.Net控件的Button更奇怪,
页面上两个Button1,Button2
点击Button1时,Button1回传,而Button2不回传,反之Button2回传而Button1不回传什么控制的呢,是html控制的还是 服务器控件控制的啊请高手指点

解决方案 »

  1.   

    点button1 是响应button1的事件,button2回传是什么概念?
    label的text也可以在程序中访问的
    在程序中赋值的
      

  2.   

    我的回传的意思是在Page.Request.Form中可见
      

  3.   

    首先:post的只是form里input的值TextBox的Web控件,被解析为<input type="text" >控件,所以能够被提交。Lable的Web控件,被解析为<span ... >控件,因此在form里找不到。Button的Web控件,被解析为<input type="submit" >控件
      

  4.   

    谢谢楼上不过两个Button时,为什么点击Button1,Button2没有被提交呢,他也是被解析成<input type='submit'> 啊
      

  5.   

    asp.net 服务器控件的回传事件功能是它如何实现IPostBackEventHandler接口决定的
    回传数据是如何实现IPostBackDataHandler接口决定的
      

  6.   

    不太同意楼上的,我觉得这个会传和实现IPostBackEventHandler和IPostBackDataHandler没什么关系,因为当你写一个Button实现IPostBackEventHandler和IPostBackDataHandler接口时,如果你不把UniqueID写到客户端,他也不可能在Page.Request.Form[]中出现的,即没有回传。
    感觉还是html的机制导致的,和ASP.NET没有关系摆脱大家再帮我研究一下吧
      

  7.   

    具有IsPostBack属性的控件,只要将其值设置为TRUE,必定会回传,没有IsPostBack属性和属性值设为FALSE的控件,一定不会回传呀
      

  8.   

    你还没有太了解b/s的回发机制,当页面有一个<form >标记时点击type=submit的button 或通过js调用submit <form> 和</form>之间的具有name属性的html tag 的value 回送到<form action =XXX.aspx 得页面。不管是asp aspx 都是一样,只不过asp.net会通过框架自动为你做好这一切
    asp 时代需要你去手动解析具体的回发内容通过Request[XXX] , asp.net 如果服务器控件实现了
    IPostBackEventHandler, 或  IPostBackDataHandler ,它回往viewstate写一些东西,来自动实现
      

  9.   

    .NET Framework 开发员指南   回发事件示例请参见
    捕获回发事件
    语言
    C#
    以下示例创建了一个自定义按钮 MyButton,该按钮引起回发、捕获回发事件并在服务器上引发 Click 事件。若要生成该示例,请参见服务器控件示例中的说明。
    [C#]
    using System;
    using System.Web.UI;namespace CustomControls 
    {  
       public class MyButton: Control, IPostBackEventHandler 
       {     
          // Defines the Click event.
          public event EventHandler Click;
          
          // Invokes delegates registered with the Click event.
          protected virtual void OnClick(EventArgs e) 
          {     
             if (Click != null) 
             {
                Click(this, e);
             }  
          }
          
          // Method of IPostBackEventHandler that raises change events.
          public void RaisePostBackEvent(string eventArgument)
          {     
             OnClick(EventArgs.Empty);
          }
          
          protected override void Render(HtmlTextWriter output) 
          {     
             output.Write("<INPUT TYPE=submit name=" + this.UniqueID + 
                " Value='Click Me' />"); 
          }
       }    
    }在页上使用控件
    下面 ASP.NET 页使用上一例中定义的自定义按钮 MyButton。[C#]
    <%@ Register TagPrefix="Custom" Namespace="CustomControls" Assembly = "CustomControls" %>
    <script language="C#" runat=server>
                  
    private void Button_Click(Object sender, EventArgs e) {
       TextBox.BackColor = System.Drawing.Color.Green;
       TextBox.Text = "You clicked the button";
    }
                      
    </script>
    <html>
       <body>                  
          <form  runat=server>                        
          Here is  the custom button.<br>
          <Custom:MyButton Id = "Button"  OnClick = "Button_Click" runat=server/> 
          <br><br>                              
          <asp:TextBox id = "TextBox" Text = "Click the button" Width = "200"  BackColor = "Cyan" runat=server/> 
          <br>                          
          </form>                             
       </body>                    
    </html>请参见
    捕获回发事件发送有关此主题的意见 &copy; 2001-2002 Microsoft Corporation。保留所有权利。 =================
    这是msdn上的例子,
      

  10.   

    .NET Framework 开发员指南   回发数据处理示例  [C#]请参见
    处理回发数据
    语言
    C#
    本示例说明其文本属性因回发而更改的自定义文本框。控件在加载回发数据后引发 TextChanged 事件。若要生成该示例,请参见服务器控件示例中的说明。[C#]
    using System;
    using System.Web;
    using System.Web.UI;
    using System.Collections.Specialized;namespace CustomControls{
          public class MyTextBox: Control, IPostBackDataHandler {
                public String Text {
                      get {
                            return (String) ViewState["Text"];
                      }
                      set { 
                            ViewState["Text"] = value;
                      }                  
                }
                
                public event EventHandler TextChanged;
                
                public virtual bool LoadPostData(string postDataKey, 
                      NameValueCollection values) {
                      String presentValue = Text;
                      String postedValue = values[postDataKey];
                      if (!presentValue.Equals(postedValue)){
                            Text = postedValue;
                            return true;
                      }
                      return false;
                }
                
                public virtual void RaisePostDataChangedEvent() {
                      OnTextChanged(EventArgs.Empty);     
                }
                
                protected virtual void OnTextChanged(EventArgs e){
                      if (TextChanged != null)
                            TextChanged(this,e);
                }
                
                protected override void Render(HtmlTextWriter output) {
                    output.AddAttribute(HtmlTextWriterAttribute.Type, "text");
                    output.AddAttribute(HtmlTextWriterAttribute.Value, this.Text);
                    output.AddAttribute(HtmlTextWriterAttribute.Name, this.UniqueID);
                    output.RenderBeginTag(HtmlTextWriterTag.Input);
                    output.RenderEndTag();
                }
          }    
    }在页上使用控件
    下面 ASP.NET 页使用上一例中定义的自定义控件 MyTextBox。[C#]
    <%@ Register TagPrefix="Custom" Namespace="CustomControls" Assembly = "CustomControls" %>
    <html>
    <script language="C#" runat=server>
      private StringBuilder message = new StringBuilder("");      private void Text_Changed(Object sender,EventArgs e){
                message.Append("The text in" + sender.ToString()+ " was changed.");
                message.Append("<br>You entered " + Server.HtmlEncode(Box.Text) +".");
          }
                
          protected override void Render(HtmlTextWriter output) {
                base.Render(output);
                output.Write(message.ToString());
          }     
    </script>
                
    <body>
                      
    <form method="POST" action="MyTextBox.aspx" runat=server>
    The text box below is an instance of a custom text box.<br>
    It raises a text changed event when the text in the text box changes.<br><br>      
    Enter your name:   <Custom:MyTextBox Text=" " OnTextChanged = "Text_Changed" id = "Box"  runat=server/>                                
    <br><br>
    <asp:Button Text = "Submit" runat = server/>                                                                              
    </form>                                               
    </body>                                          
    </html>
    请参见
    处理回发数据发送有关此主题的意见 &copy; 2001-2002 Microsoft Corporation。保留所有权利。 
      

  11.   

    楼上没有明白我的意思,上面两个例子我都研究了,也明白的,正是研究上面的时候发现的一个问题:
    再贴一遍我的问题
    页面上两个Button1,Button2
    点击Button1时,Button1回传,而Button2不回传,反之Button2回传而Button1不回传什么控制的呢,是html控制的还是 服务器控件控制的啊
      

  12.   

    你是如何判断Button回传的?
    对于Button而言,只要其有name属性,就会将value提交,如果没有,就不会提交。一般来说都不会给Button设置name属性。至于ASP.NET,他虽然把所有的Button都变成了submit,但实际上提交机制还是由ASP.NET自己控制的。
      

  13.   

    另外看到TextBox又问另一个费疑的问题:Reflector看到TextBox的源码,在AddAttributeToRender中,如果AutoPostBack==true:      if (this.AutoPostBack && (this.Page != null))
          {
                string text2 = this.Page.GetPostBackClientEvent(this, "");
                if (base.HasAttributes)
                {
                      string text3 = base.Attributes["onchange"];
                      if (text3 != null)
                      {
                            text2 = text3 + text2;
                            base.Attributes.Remove("onchange");
                      }
                }
                writer.AddAttribute(HtmlTextWriterAttribute.Onchange, text2);
                writer.AddAttribute("language", "javascript");
          }
          base.AddAttributesToRender(writer);
    即它是通过__doPostBack(EventTarget,EventArgument)js脚本产生postback而再看Page的源码,ProcessPostData():
    private void ProcessPostData(NameValueCollection postData, bool fBeforeLoad)
    {
          if (this._changedPostDataConsumers == null)
          {
                this._changedPostDataConsumers = new ArrayList();
          }
          if (postData != null)
          {
                foreach (string text1 in postData)
                {//////////////////////////看这里啊,标示为A1////////////////////////
                      if ((text1 != null) && !Page.s_systemPostFields.Contains(text1))
                      {
                            Control control1 = this.FindControl(text1);
                            if (control1 == null)
                            {
                                  if (fBeforeLoad)
                                  {
                                        if (this._leftoverPostData == null)
                                        {
                                              this._leftoverPostData = new NameValueCollection();
                                        }
                                        this._leftoverPostData.Add(text1, null);
                                  }
                            }
                            else if (!(control1 is IPostBackDataHandler))
                            {
                                  if (control1 is IPostBackEventHandler)
                                  {
                                        this.RegisterRequiresRaiseEvent((IPostBackEventHandler) control1);
                                  }
                            }
                            else
                            {
                                  IPostBackDataHandler handler1 = (IPostBackDataHandler) control1;
                                  if (handler1.LoadPostData(text1, this._requestValueCollection))
                                  {
                                        this._changedPostDataConsumers.Add(handler1);
                                  }
                                  if (this._controlsRequiringPostBack != null)
                                  {
                                        this._controlsRequiringPostBack.Remove(text1);
                                  }
                            }
                      }
                }
          }
          ArrayList list1 = null;
          if (this._controlsRequiringPostBack != null)
          {
                foreach (string text2 in this._controlsRequiringPostBack)
                {
                      Control control2 = this.FindControl(text2);
                      if (control2 != null)
                      {
                            IPostBackDataHandler handler2 = control2 as IPostBackDataHandler;
                            if (handler2 == null)
                            {
                                  throw new HttpException(HttpRuntime.FormatResourceString("Postback_ctrl_not_found", text2));
                            }
                            if (handler2.LoadPostData(text2, this._requestValueCollection))
                            {
                                  this._changedPostDataConsumers.Add(handler2);
                            }
                      }
                      else if (fBeforeLoad)
                      {
                            if (list1 == null)
                            {
                                  list1 = new ArrayList();
                            }
                            list1.Add(text2);
                      }
                }
                this._controlsRequiringPostBack = list1;
          }
    }在A1标注处if ((text1 != null) && !Page.s_systemPostFields.Contains(text1))
    据网上说,systemPostFields包含EventTarget,EventArgument,ViewSate,这样的话整个表达式应该为false,那么if语句不会执行,那么TextBox的LoadPostData()就不会被调用,那么RaisPostBackData()也就不会被调用,从而OnTextBoxChange就不会被触发,但是这个控件是好的阿,我的推理是不是有什么错误呢??这个问题复杂了点,如果嫌分少,可以再加,呵呵??
      

  14.   

    button1和button2的问题
    ASP.NET生成的叶面有三个隐藏字段:
    1.用来保存viewstate,这个跟这个问题没什么关系
    2.用来保存一个命令名
    3.用来保存一个命令参数button1和button2并没有被解析成submit,而是解析成了button,这样点击任何一个都不会引起postback,真正postback的是一个javascript,点击button1或button2,就会调用这个javascript,javascript根据你点击的是1还是2设置命令名。
    因此我觉得是javascript控制的
      

  15.   

    Ivony() ( ) 信誉:100    Blog  2006-10-12 10:30:00  得分: 0  
     
     
       你是如何判断Button回传的?
    对于Button而言,只要其有name属性,就会将value提交,如果没有,就不会提交。一般来说都不会给Button设置name属性。至于ASP.NET,他虽然把所有的Button都变成了submit,但实际上提交机制还是由ASP.NET自己控制的。
    ----------------------------------------------------------------------
    我经过测试的,叶面上有两个button,都有name属性,当一个button点击提交时,另外一个button不会提交,我的主要疑问在这阿
     
      

  16.   

    Nick_Nick() ( ) 信誉:100    Blog  2006-10-12 10:39:00  得分: 0  
     
     
       button1和button2的问题
    ASP.NET生成的叶面有三个隐藏字段:
    1.用来保存viewstate,这个跟这个问题没什么关系
    2.用来保存一个命令名
    3.用来保存一个命令参数button1和button2并没有被解析成submit,而是解析成了button,这样点击任何一个都不会引起postback,真正postback的是一个javascript,点击button1或button2,就会调用这个javascript,javascript根据你点击的是1还是2设置命令名。
    因此我觉得是javascript控制的--------------------------------------------------
    我已经是过了啊,type是“submit”,因为asp.net的button控件到前台都是submit的,所以不是__dopostback回传的
     
      

  17.   

    input type=submit name="BUTTON1"
    点击后
    会形成一个
    .... BUTTON1=Button得回送字符串
      

  18.   

    If the user clicks the Submit button to submit the form, and that button has a name attribute specified, that button contributes a name/value pair to the submitted data.
      

  19.   

    呵呵,搞了半天就是要一句权威的这句话:
    If the user clicks the Submit button to submit the form, and that button has a name attribute specified, that button contributes a name/value pair to the submitted data.顺便问一下,能给一下这句话的出处么
      

  20.   

    另外那个TextBox的事呢,就是我写的最长的那一段
      

  21.   

    else if (!(control1 is IPostBackDataHandler))
      

  22.   

    else
                            {
                                  IPostBackDataHandler handler1 = (IPostBackDataHandler) control1;
                                  if (handler1.LoadPostData(text1, this._requestValueCollection))
                                  {
                                        this._changedPostDataConsumers.Add(handler1);
                                  }
                                  if (this._controlsRequiringPostBack != null)
                                  {
                                        this._controlsRequiringPostBack.Remove(text1);
                                  }
      

  23.   

    楼上的好像不对啊,你写的那些都是在
    if ((text1 != null) && !Page.s_systemPostFields.Contains(text1))
    {
    }
    里面的啊,根本进不去嘛