我在asp.net页面上有一个asp:TextBox和一个提交按钮。单击按钮后,将回发TextBos的值。我将把回发的文本值保留到会话中,以便其他子控件可以在其Page_Load期间访问该值。但是,我总是在Page_Load方法中得到NOTHING(“”),我可以在按钮单击处理程序中读取文本。我知道“按钮点击事件”发生在Page_Load之后。所以,我问如何在Page_Load期间“预取”TextBox.text?
public partial class form_staffinfo : System.Web.UI.UserControl
{
protected void Page_Load(object sender, EventArgs e){
string s = staff_id.Text; //Reach this line first, but GET empty value. However, I want to keep it in the session during this moment.
}
protected void btn_submit_Click(object sender, EventArgs e) {
string s = staff_id.Text; //Reach this line afterward, value got.
}
}
- 已编辑 -
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="form_staffinfo.ascx.cs" Inherits="form_staffinfo" %>
<asp:Label ID="Label1" runat="server" Text="Staff ID: "></asp:Label>
<asp:TextBox ID="staff_id" runat="server" ></asp:TextBox>
<asp:Button ID="btn_submit" runat="server" Text="Query" OnClick="btn_submit_Click" />
由于我无法在Page_Load中获取TextBox的文本,因此,我没有包含任何与会话相关的代码以进行清晰的演示。
谢谢! 威廉
答案 0 :(得分:2)
您的服务器控件的任何值都不可在Page_Load中使用。在验证表单之后(在加载表单之后)和表单控件的事件触发之前(例如按钮单击,在您的示例中)分配这些控件。发布的值位于Request.Form
集合中。查看AllKeys
属性,如果您使用发布的示例,则应该看到以$staff_id
结尾的密钥。键中可能还有其他字符,具体取决于控件是嵌套在母版页还是其他控件中。
如果你必须在页面加载时拥有该值,请从Request.Form
集合而不是用户控件中获取它,但我会质疑在页面生命周期的早期捕获值的智慧。如果你需要保留Session中的值,你可以想象捕获文本框的OnTextChanged事件。
编辑 - 附加说明 如果您要为用户控件创建自定义事件,则只需要执行几个步骤。
创建委托。这将是控制间消息传递的通用对象。
public delegate void StaffIdChangedEvent(object sender, string staffId);
使用将要广播的用户控件中的该委托声明一个事件。
public event StaffIdChangedEvent StaffIdChanged;
在您的用户控件中,当您准备好广播时(例如来自Staff_id文本框的OnTextChanged事件),您只需调用事件[通常是检查事件是否为空的最佳做法]
this.StaffIdChangedEvent(this, "staff-id-value-here");
最后一步是将用户控件事件连接到事件处理程序(这可以防止我在尝试调用事件时提到的空状态)。您可以将处理程序连接到托管页面。
this.form_staffinfo.StaffIdChangedEvent += this.some_method_on_page;
确保页面上的方法与用于声明事件的委托具有相同的方法签名。
事件也可以连接到需要了解它们的每个控件(查找多播委托),因此您可以执行以下操作:
this.form_staffinfo.StaffIdChangedEvent += this.some_method_on_page;
this.form_staffinfo.StaffIdChangedEvent += this.some_control_on_the_page;
this.form_staffinfo.StaffIdChangedEvent += this.some_other_control_on_the_page;
无论如何,我通常更喜欢在页面的OnInit方法中进行这种类型的布线。
override protected void OnInit(EventArgs e)
{
base.OnInit(e);
InitializeComponent();
}
并且只需编写自己的InitializeComponent方法来集中您必须执行的任何连接。
答案 1 :(得分:1)
还有其他设置文本框值的内容。您能否检查一下是否覆盖了Page_Load之前发生的其他事件并修改了文本框文本属性。甚至,在更新会话变量的位置发布代码也很方便。从您发布的代码中,它应该可以正常工作。
答案 2 :(得分:0)
您是否禁用了autoeventwireup?我可能会弄错,但我认为如果它被禁用,你的Page_Load就不会被激活。如果要禁用它,则可以始终覆盖OnLoad事件...
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
// do stuff
}