我有一个表格,其中包含我在数据库中拥有的所有对象。我在我的Page_Load函数中加载它们。我有一个文本字段和一个按钮,当单击按钮时,我希望该单击的处理程序放置一个新对象,其名称写在数据库的文本字段中。
现在,我希望点击后发生的事情是页面再次加载表中的新项目。问题是按钮事件处理程序在Page_Load函数之后运行。
对此的解决方案是在Page_Load中使用IsPostBack或使用预加载功能。一个问题是,如果我有3个不同的按钮,我必须在它们之间有所不同,而不是有3个不同的方便功能。
任何没有此问题的解决方案?
代码:
protected void Page_Load(object sender, EventArgs e)
{
if (Session["userId"] == null)
Response.Redirect("Login.aspx");
// LOAD DATA FROM DB
}
protected void CreateObject(object sender, EventArgs e)
{
// SAVE THE NEW OBJECT
}
答案 0 :(得分:8)
也许你应该尝试在PreRender而不是Load
期间加载数据 protected void Page_Load(object sender, EventArgs e)
{
this.PreRender += Page_PreRender
if (Session["userId"] == null)
Response.Redirect("Login.aspx");
}
protected bool reloadNeeded {get; set;}
protected void CreateObject(object sender, EventArgs e)
{
// SAVE THE NEW OBJECT
reloadNeeded = true;
}
protected void Page_PreRender(object sender, EventArgs e)
{
if(reloadNeeded || !IsPostBack)
// LOAD DATA FROM DB
}
答案 1 :(得分:1)
您可以检查事件目标并执行您需要的操作:
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack)
{
string eventTarget = Page.Request.Params["__EVENTTARGET"];
if(whatever)
{
//do your logic here
}
}
}
Get control name in Page_Load event which make the post back
答案 2 :(得分:0)
使用Page_PreRenderComplete事件检索您的表格。这样,在所有用户事件被触发后,您的页面将始终具有最新数据。
答案 3 :(得分:0)
为什么不将点击事件中的内容移动到新方法中。然后将该方法称为页面加载的第一行?
答案 4 :(得分:0)
一个老问题,但我在带有主页/内容页面的C#/ ASP.NET网站中遇到了同样的问题:点击主页面上的链接应该更改内容页面上gridview的查询参数。如您所述,按钮点击事件在 Page_Load
之后处理。但它在 Page_LoadComplete
之前处理(请参阅有关ASP.NET Page Life Cycle的信息),因此您可以在那里更改页面内容。
在我的情况下,我通过在母版页的click事件中设置会话变量,在内容页面的Page_LoadComplete事件中获取此变量并基于此来执行数据绑定来解决问题。
母版页
<asp:LinkButton ID="Btn1" runat="server" OnCommand="LinkCommand" CommandArgument="1" >Action 1</asp:LinkButton>
<asp:LinkButton ID="Btn2" runat="server" OnCommand="LinkCommand" CommandArgument="2" >Action 2</asp:LinkButton>
protected void LinkCommand(object sender, CommandEventArgs e)
{
HttpContext.Current.Session["BindInfo", e.CommandArgument.ToString());
}
内容页面
protected void Page_LoadComplete(object sender, EventArgs e)
{
string BindInfo = HttpContext.Current.Session["BindInfo"].ToString();
YourBindDataFunction(BindInfo);
}