【问题标题】:ASP.NET C#, need to press a button twice to make something happenASP.NET C#,需要按两次按钮才能发生某些事情
【发布时间】:2022-02-05 04:07:55
【问题描述】:

我有一个web应用程序,问题是第一次点击标签中的文字不会更新,我需要点击两次按钮,我调试代码,发现标签没有收到数据直到第二次点击后,

这是我的代码:

System.Data.SqlClient.SqlCommand command = new System.Data.SqlClient.SqlCommand();
System.Data.SqlClient.SqlConnection connection;
string CommandText;
string game;
string modtype;
bool filter;
protected void Page_Load(object sender, EventArgs e)
{

    labDownloadList.Text = null;

    //Session variables:
    if (Session["Game"] != null)
    {
        game = Convert.ToString(Session["Game"]);
    }
    if (Session["ModType"] != null)
    {
        modtype = Convert.ToString(Session["ModType"]);
    }
    if (Session["FilterBool"] != null)
    {
        filter = Convert.ToBoolean(Session["FilterBool"]);
    }
    string ConnectionString = "Data Source=.\\SQLEXPRESS;AttachDbFilename=C:\\inetpub\\wwwroot\\stian\\App_Data\\Database.mdf;Integrated Security=True;User Instance=True";
    connection = new System.Data.SqlClient.SqlConnection(ConnectionString);
    System.Data.SqlClient.SqlDataReader reader;
    command = connection.CreateCommand();
    connection.Open();
    CommandText = "SELECT * FROM Command";
    if (filter)
    {
        CommandText = "SELECT * FROM Command WHERE Game='" + game + "' AND Type='" + modtype + "'";
    }
    command.CommandText = CommandText;
    reader = command.ExecuteReader();
    labDownloadList.Text = "";
    while (reader.Read())
    {
        string game = reader.GetString(1);
        string author = reader.GetString(2);
        string downloadlink = reader.GetString(3);
        string size = reader.GetString(4);
        string description = reader.GetString(5);
        string version = reader.GetString(6);
        string screenshotlink = reader.GetString(7);
        Int64 AmountDownloaded = reader.GetInt64(8);

        labDownloadList.Text += "Game: " + game + "<br>";
        labDownloadList.Text += "Author: " + author + "<br>";
        labDownloadList.Text += "Size: " + size + "<br>";
        labDownloadList.Text += "Description: " + description + "<br>";
        labDownloadList.Text += "Version: " + version + "<br>";
        labDownloadList.Text += "<img src='" + screenshotlink + " /><br>";
        labDownloadList.Text += "Downloaded: " + AmountDownloaded + " times<br><hr>";
        labDownloadList.Text += "<a href='" + downloadlink + "'>Download</a><br>";
    }
}

protected void Page_UnLoad(object sender, EventArgs e)
{
    Session["Game"] = game;
    Session["ModType"] = modtype;
    Session["FilterBool"] = filter;
    connection.Close();
}

protected void btnFilter_Click(object sender, EventArgs e)
{
    game = lstGames.SelectedValue;
    modtype = lstTypeMod.SelectedValue;
    filter = true;
}

【问题讨论】:

  • 一些 OT cmets: - 你不需要做 Convert.ToString(Session["game"])。 Session[name] 是一个对象,因此您只需将其转换回:(string)Session["game"] - 您应该查看参数化 SQL,因为您很容易受到注入攻击
  • 一定要查看参数化 SQL。

标签: c# asp.net


【解决方案1】:

非常清楚。按钮单击事件发生在 Page_Load 事件之后,这意味着过滤不会在第一次回发时应用。它已在第二次回发时更新,您会看到过滤。使您的代码工作的最简单更改是将 Page_Load 事件中的所有代码移动到 OnPreRender 中,以便在按钮单击事件之后发生重新加载。

然而,一个更干净的解决方案可能是将它移到 LoadData 函数中,并在它不是回发时在 PageLoad 上调用它,并在更新过滤器后在按钮单击事件上调用它。这将防止在不需要重新加载数据的任何回发页面周期中调用数据库:

 
protected void Page_Load(object sender, EventArgs e)
{    
    if (!Page.IsPostBack)
        {   
             LoadData()
        }
}

private void LoadData()
{
    labDownloadList.Text = null;
    //Session variables:    
    if (Session["Game"] != null)
    ...
}

protected void btnFilter_Click(object sender, EventArgs e)
{    
    game = lstGames.SelectedValue;
    modtype = lstTypeMod.SelectedValue;
    filter = true;
    LoadData();
}
 

对于刚起步的 ASP.Net 开发人员的最后一条快速建议是彻底了解页面生命周期。了解页面上的事件顺序至关重要。祝你好运。

【讨论】:

  • 感谢您的回答。但是,实际声明 BUTTON 的预渲染会更清楚,而不是 PAGE。
【解决方案2】:

Microsoft 对Page Life Cycle 的概述可能有助于理解流程(并解决您的问题)。

【讨论】:

  • 这篇文章太棒了,我一直在向人们推荐它
【解决方案3】:

按钮单击事件处理程序发生在 Page_Load 之后。尝试改用 Page_LoadComplete。

因此,在您的代码中,一旦单击按钮,就会触发 page_load 事件并设置数据,然后触发 btnClick 事件并更改数据。但是,数据已经以旧形式绑定。这就是为什么它需要点击 2 次才能工作的原因。

如果您将相同的 page_load 代码放入 page_loadcomplete 事件中,它将在 btnClick 事件之后发生。这应该会产生预期的结果。

【讨论】:

    【解决方案4】:

    我没有看到典型的

    if (!Page.IsPostBack)
    {
       ...
    }
    

    在您的 Page_Load 方法中,这意味着每次加载页面时都会发生 datbinding,这很可能会导致您的问题。我建议将其添加到代码中,看看它是否能解决问题。

    【讨论】:

      【解决方案5】:

      JackCom,解决方案奏效了!谢谢你。我将研究页面生命周期。 我必须补充一点,我只有软件开发方面的经验,我今年秋天才开始进行 Web 开发。

      【讨论】:

        【解决方案6】:

        我在我的页面上遇到了同样的问题。 每次我必须点击两次才能让它工作。 这是由某些文本框和下拉列表将自动回发设置为 true 引起的。 一旦我删除了自动回发,甚至可以顺利进行单击触发。

        【讨论】:

          【解决方案7】:

          我被困在这个问题上大约一个星期。最后,我将Button_Click 事件的代码放在TextChanged 事件中,并且它起作用了。按下按钮使焦点离开TextBox,这样当Button_click 事件没有触发时,事件就会触发。非常笨拙。我不喜欢它。

          我发现一篇有趣的文章实际上并不适合我,但我很高兴我还是读了它:Enter and the Button Click Event

          这可能适用于其他情况。

          【讨论】:

            【解决方案8】:

            ASP.Net 有时会做一些非常奇怪的事情。我今天遇到了同样的问题。我发现我在 TextBox 上放了一个 AutoPostBack = "true ,即使它没有达到我想要的效果,我也忘记将 AutoPostBack 从标记中取出。当我单击同一表格行中的按钮时,第一次单击导致两次回发,但没有触发按钮事件。第二次单击按钮时,按钮单击事件触发。当我从标记中找到无关的 AutoPostBack 时,按钮事件在第一次单击时开始触发。有人会认为除了按钮单击事件引用了文本框的内容之外,文本框与按钮没有任何关系。

            【讨论】:

              【解决方案9】:

              我对此不太了解,但这个技巧对我有用:

              function pageLoad(sender, args) {
                  $(document).ready(function () {
                      //your stuff
                  });
                  $(":button").each(function() {
                      $(this).click();
                      //this is a trick;  click one when page load,
                  });
              }
              

              【讨论】:

              • 虽然这在技术上可能有效,但您能否查看代码并首先确定为什么代码无法正常工作?
              【解决方案10】:

              我遇到了这个问题,因为我使用“Server.Transfer”在页面之间切换。当我改为“Response.Redirect”时,问题就解决了。

              【讨论】:

                【解决方案11】:

                在将 VB 项目转换为 C# 后,我遇到了双击事件的问题。发现转换器转换了后面的代码而不是ascx和aspx页面代码,仍然说language="vb"。将那个一点一点地转换成 C# 然后声明 language="cs" 解决了这个问题。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-07-29
                  • 2022-08-19
                  • 1970-01-01
                  • 2014-08-08
                  • 2017-09-23
                  • 1970-01-01
                  • 2013-05-10
                  相关资源
                  最近更新 更多