Asp.net 正在回发文本框。是否加载页面中的文本?
我的asp.net页面上有一个asp:TextBox和一个submit按钮。单击按钮后,TextBos的值将被发回。我将把返回的文本值保留到会话中,以便其他子控件可以在其页面加载期间访问该值。但是,我在Page_Load方法中始终没有得到任何(“”),我可以在按钮单击处理程序中读取文本。我知道“按钮点击事件”发生在页面加载之后。所以,我在问如何在页面加载期间“预取”TextBox.textAsp.net 正在回发文本框。是否加载页面中的文本?,asp.net,postback,pageload,Asp.net,Postback,Pageload,我的asp.net页面上有一个asp:TextBox和一个submit按钮。单击按钮后,TextBos的值将被发回。我将把返回的文本值保留到会话中,以便其他子控件可以在其页面加载期间访问该值。但是,我在Page_Load方法中始终没有得到任何(“”),我可以在按钮单击处理程序中读取文本。我知道“按钮点击事件”发生在页面加载之后。所以,我在问如何在页面加载期间“预取”TextBox.text public partial class form_staffinfo : System.Web.UI.U
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.
}
}
--编辑--
由于我无法在页面加载中获取文本框的文本,因此,我没有包含任何与会话相关的代码以清晰地显示
谢谢大家!!
William还有其他设置文本框值的方法。请检查您是否正在覆盖加载页面和修改textbox文本属性之前发生的其他事件。甚至,在更新会话变量的地方发布代码也很方便。根据您发布的代码,它应该可以工作。您是否禁用了autoeventwireup?我可能弄错了,但我认为如果它被禁用,您的页面加载将不会启动。如果要使其处于禁用状态,则始终可以覆盖OnLoad事件
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
// do stuff
}
服务器控件的任何值都不能在页面加载中使用。这些控件是在表单验证之后(即加载表单之后)和表单控件事件触发之前(如示例中的按钮单击)分配的。发布的值位于
Request.Form
集合中。查看AllKeys
属性,如果您使用发布的示例,您应该会看到一个以$staff\u id
结尾的键。根据控件是否嵌套在母版页或其他控件中,键的from中可能有其他字符
如果您在页面加载时必须拥有该值,请从Request.Form
集合而不是用户控件中获取该值,但我怀疑在页面生命周期的早期获取该值是否明智。如果需要在会话中保留该值,您可以捕获textbox的ContextChanged事件
编辑-附加说明
如果要为用户控件创建自定义事件,只需几个步骤
创建一个委托。这将是控件间消息传递的公共对象
public delegate void StaffIdChangedEvent(object sender, string staffId);
在要广播的用户控件中使用该委托声明事件
public event StaffIdChangedEvent StaffIdChanged;
在用户控件中,当您准备广播时(比如从Staff_id textbox的OnTextChanged事件),您只需调用事件[通常最好检查事件是否为空]
this.StaffIdChangedEvent(this, "staff-id-value-here");
最后一步是将用户控件事件连接到事件处理程序(这可以防止在尝试调用事件时出现我上面提到的null情况)。您可以将处理程序连接到宿主页面
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方法来集中您必须执行的任何接线。我同意-问题出在其他地方。你应该可以在第2页上找到文本,谢谢。由于页面上还有其他用户控件,因此将根据文本框(staff_id)加载相应的内容。您能否建议获得价值的最佳时机和方式,以便其他页面可以访问该价值?我可能会参加一个活动。具有文本框的用户控件可能有一个事件(
StaffIdChanged
),其他需要了解该事件的用户控件可以订阅该事件。我会更新我的答案以更充分地解释。好主意!一个问题是,我的用户控件是由代码动态加载的,这个想法仍然可行吗?对于动态加载的控件来说,这个原则仍然是合理的。Jonathan,帮帮忙。您的方法更准确,更具体系结构,而我一直在考虑后期数据处理。非常感谢你。
override protected void OnInit(EventArgs e)
{
base.OnInit(e);
InitializeComponent();
}