希望您能提供帮助。
我有一个aspx Web应用程序,该应用程序具有一个从SQlite填充的列表,用于存储手机号码
我有一个按钮,可以让我启用/禁用文本框-都可以。
现在,当我过滤视图并单击“编辑”时,页面将重新加载。
按钮/文本框是从SQLite动态创建的。
TextBox NES_editText = new TextBox();
NES_editText.CssClass = "editText";
NES_editText.Enabled = false;
NES_editText.Text = SQLReader["simName"].ToString();
NES_editText.ID = 300 + SQLReader["simNESID"].ToString();
Sim_Rows.Controls.Add(NES_editText);
Sim_Rows.Controls.Add(new LiteralControl("</div>")); // COL 2
Sim_Rows.Controls.Add(new LiteralControl("<div class=\"col col-3\" data-label=\"Edit Name\">"));
Button editButton = new Button();
editButton.CssClass = "editButton";
editButton.ID = SQLReader["simNESID"].ToString();
editButton.Click += new EventHandler(EditButton_Click);
Sim_Rows.Controls.Add(editButton);
Sim_Rows.Controls.Add(new LiteralControl("</div>")); // COL 3
这是我的编辑按钮代码
private void EditButton_Click(object sender, EventArgs e)
{
Button NES_Edit = sender as Button;
//TextBox NES_Text = new TextBox();
String TxtID;
//Response.Write(NES_Edit.ID);
foreach (Control obj in Sim_Rows.Controls)
{
if (obj is TextBox)
{
TxtID = obj.ID.Substring(3);
if (NES_Edit.ID == TxtID)
{
if (((TextBox)obj).Enabled == false)
{
((TextBox)obj).Enabled = true;
((TextBox)obj).Style.Add("border-bottom", "1px solid #000");
((TextBox)obj).Style.Add("width", "270px");
NES_Edit.CssClass = "button_enabled";
//Response.Write(NES_Edit.ID);
break;
}
else
{
((TextBox)obj).Enabled = false;
((TextBox)obj).Style.Remove("border-bottom");
NES_Edit.CssClass = "editButton";
SQL = "UPDATE Sims SET simName = @simName WHERE simNESID =" + NES_Edit.ID;
using (SQLiteConnection SQLCon = new SQLiteConnection(ConnectionString))
{
SQLiteCommand SQLCmd = new SQLiteCommand(SQL, SQLCon);
SQLCmd.Parameters.AddWithValue("@simName", ((TextBox)obj).Text );
try
{
SQLCon.Open();
SQLCmd.ExecuteNonQuery();
}
catch (SQLiteException Ex)
{
Response.Write(Ex.Message);
}
SQLCon.Close();
// SEND EMAIL
}
break;
}
}
}
}
}
当我过滤视图时,有两个结果并单击编辑,页面将重新加载。
有什么办法阻止它?
答案 0 :(得分:2)
遗憾的是,当Microsoft发布该框架时,他们的想法是Web应用程序应像桌面应用程序一样工作。这个概念与构建Web应用程序的协议相冲突。 Web应该体现一种无状态的体系结构,但是Microsoft的Web Form框架是由状态驱动的。
以上是页面固有的工作方式。因此,当您按下按钮时,事件将被重新排序并执行。在这种情况下,执行所谓的回发。发生这种情况时,服务器将采取事件,然后将再次呈现页面。
为消除这种麻烦,Microsoft引入了称为input: elements_from_crs_not_in_args('1','2')
result: ['3']
的控件。面板会将整个页面状态加载到内存中,然后再次渲染页面后,将在控件中显示修改后的部分。这样一来,状态驱动的架构就不会向客户端传达服务器正在保留内容。
UpdatePanel
当前,页面每次初次加载时都具有默认状态。但是在更新面板中,我们有了内容,但是现在当我们触发按钮时:
<asp:UpdatePanel id="upExample" runat="server">
<ContentTemplate>
<asp:Label id="lblExample" runat="server" Text="Initial Load."></asp:Label>
</ContentTemplate>
</asp:UpdatePanel>
<asp:Button id="btnExample" runat="server" OnClick="UpdateLabel_Click" Text="Update" />
您会注意到屏幕闪烁消失了,因为protected void UpdateLabel_Click(object sender, EventArgs e) =>
lblExample.Text = $"Button clicked at: {DateTime.Now:MMMM dd, yyyy hh:mm:ss}";
中的控件是服务器事件之后正在呈现的页面的唯一部分。另一种方法是使用Ajax方法和处理程序。
希望这提供了足够的信息来帮助您。