ASP.NET的页面提交时,有些控件回传了,有些没有,有什么规则么????学习编写控件想到的问题

Robert_Wang1983 2006-10-10 05:55:30
比如TextBox一定会回传,而Lable不会,
而Asp.Net控件的Button更奇怪,
页面上两个Button1,Button2
点击Button1时,Button1回传,而Button2不回传,反之Button2回传而Button1不回传

什么控制的呢,是html控制的还是 服务器控件控制的啊

请高手指点
...全文
386 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
darey_dry 2006-12-12
  • 打赏
  • 举报
回复
好长,没看完,做个记号
szh3210 2006-10-31
  • 打赏
  • 举报
回复
mark
Robert_Wang1983 2006-10-12
  • 打赏
  • 举报
回复
楼上的好像不对啊,你写的那些都是在
if ((text1 != null) && !Page.s_systemPostFields.Contains(text1))
{
}
里面的啊,根本进不去嘛
真相重于对错 2006-10-12
  • 打赏
  • 举报
回复
else
{
IPostBackDataHandler handler1 = (IPostBackDataHandler) control1;
if (handler1.LoadPostData(text1, this._requestValueCollection))
{
this._changedPostDataConsumers.Add(handler1);
}
if (this._controlsRequiringPostBack != null)
{
this._controlsRequiringPostBack.Remove(text1);
}
真相重于对错 2006-10-12
  • 打赏
  • 举报
回复
else if (!(control1 is IPostBackDataHandler))
Robert_Wang1983 2006-10-12
  • 打赏
  • 举报
回复
另外那个TextBox的事呢,就是我写的最长的那一段
Robert_Wang1983 2006-10-12
  • 打赏
  • 举报
回复
呵呵,搞了半天就是要一句权威的这句话:
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.

顺便问一下,能给一下这句话的出处么
真相重于对错 2006-10-12
  • 打赏
  • 举报
回复
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.
真相重于对错 2006-10-12
  • 打赏
  • 举报
回复
input type=submit name="BUTTON1"
点击后
会形成一个
.... BUTTON1=Button得回送字符串
Robert_Wang1983 2006-10-12
  • 打赏
  • 举报
回复
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回传的

Robert_Wang1983 2006-10-12
  • 打赏
  • 举报
回复
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不会提交,我的主要疑问在这阿

Nick_Nick 2006-10-12
  • 打赏
  • 举报
回复
button1和button2的问题
ASP.NET生成的叶面有三个隐藏字段:
1.用来保存viewstate,这个跟这个问题没什么关系
2.用来保存一个命令名
3.用来保存一个命令参数

button1和button2并没有被解析成submit,而是解析成了button,这样点击任何一个都不会引起postback,真正postback的是一个javascript,点击button1或button2,就会调用这个javascript,javascript根据你点击的是1还是2设置命令名。
因此我觉得是javascript控制的
Robert_Wang1983 2006-10-12
  • 打赏
  • 举报
回复
另外看到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就不会被触发,但是这个控件是好的阿,我的推理是不是有什么错误呢??

这个问题复杂了点,如果嫌分少,可以再加,呵呵??
Ivony 2006-10-12
  • 打赏
  • 举报
回复
你是如何判断Button回传的?


对于Button而言,只要其有name属性,就会将value提交,如果没有,就不会提交。一般来说都不会给Button设置name属性。至于ASP.NET,他虽然把所有的Button都变成了submit,但实际上提交机制还是由ASP.NET自己控制的。
Robert_Wang1983 2006-10-12
  • 打赏
  • 举报
回复
楼上没有明白我的意思,上面两个例子我都研究了,也明白的,正是研究上面的时候发现的一个问题:
再贴一遍我的问题
页面上两个Button1,Button2
点击Button1时,Button1回传,而Button2不回传,反之Button2回传而Button1不回传

什么控制的呢,是html控制的还是 服务器控件控制的啊
真相重于对错 2006-10-12
  • 打赏
  • 举报
回复
.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>


请参见
处理回发数据

发送有关此主题的意见

© 2001-2002 Microsoft Corporation。保留所有权利。

真相重于对错 2006-10-12
  • 打赏
  • 举报
回复
.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>

请参见
捕获回发事件

发送有关此主题的意见

© 2001-2002 Microsoft Corporation。保留所有权利。

=================
这是msdn上的例子,
真相重于对错 2006-10-12
  • 打赏
  • 举报
回复
你还没有太了解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写一些东西,来自动实现

sweetsbaby 2006-10-12
  • 打赏
  • 举报
回复
具有IsPostBack属性的控件,只要将其值设置为TRUE,必定会回传,没有IsPostBack属性和属性值设为FALSE的控件,一定不会回传呀
Robert_Wang1983 2006-10-12
  • 打赏
  • 举报
回复
不太同意楼上的,我觉得这个会传和实现IPostBackEventHandler和IPostBackDataHandler没什么关系,因为当你写一个Button实现IPostBackEventHandler和IPostBackDataHandler接口时,如果你不把UniqueID写到客户端,他也不可能在Page.Request.Form[]中出现的,即没有回传。
感觉还是html的机制导致的,和ASP.NET没有关系

摆脱大家再帮我研究一下吧
加载更多回复(5)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧