【发布时间】:2017-05-16 21:37:08
【问题描述】:
我有一个aspx 网络表单,它有一组控件和一个提交按钮。
- 在页面的
Page_Load事件中,我用数据填充控件。 - 在按钮点击事件中,我必须将表单数据保存在数据库中并使用
Response.Redirect重定向到另一个页面。
在测试过程中,我发现单击按钮时也会调用Page_Load event。是否可以只使用Page_Load事件填充控件并保存数据,而不使用按钮点击?
【问题讨论】:
我有一个aspx 网络表单,它有一组控件和一个提交按钮。
Page_Load 事件中,我用数据填充控件。 Response.Redirect重定向到另一个页面。在测试过程中,我发现单击按钮时也会调用Page_Load event。是否可以只使用Page_Load事件填充控件并保存数据,而不使用按钮点击?
【问题讨论】:
是的,如果您完全确定只有一个控件会导致回发,您可以只使用 Page_Load 和 IsPostBack 标志来添加应该进入按钮单击事件的代码。
如果有多个控件可能导致 PostBack(按钮、单选按钮、下拉菜单等),您将需要为每个具有单独逻辑的控件单独的事件处理程序,因为您无法轻松识别导致 postBack 的控件在PageLoad 事件中。
在你只有一个按钮的情况下,我觉得 Page_Load 中的代码带有 IsPostBack 检查。
但始终建议在 Click 事件处理程序本身中包含 Button Click 事件逻辑。这样您就不需要进行 IsPostBack 检查。代码看起来也很干净。
protected void Page_Load(object sender, EventArgs e)
{
FillControls();
if (IsPostBack) //Will work. But can get executed for postback caused by any other control
{
SaveToDB();
Response.Redirect("URL");
}
}
protected void Btn_Click(object sender, EventArgs e)
{
//Assurance that this code will execute only for PostBack caused by Button.
SaveToDB();
Response.Redirect("URL");
}
【讨论】:
是的,但建议使用 click 事件来获得干净的代码 如果你不使用事件,你可以用
if(IsPostBack)
{
//do something
}
如果你有多个按钮,你将为每个按钮添加一个条件
if (IsPostBack)
{
string target = Request.Params["__EVENTTARGET"].ToString();
if (target == "send")
{
//do something
}
if (target == "update")
{
//do something
}
}
【讨论】:
page_load 是页面生命周期的一部分,您不能排除它的执行,您只能添加对 IsPostBack 的检查
if(!IsPostBack)
{
//Add Your Page Load Code Here
}
【讨论】: