【问题标题】:Problem with very simple ASP.NET 3.5 app, using C#使用 C# 的非常简单的 ASP.NET 3.5 应用程序的问题
【发布时间】:2010-03-02 15:20:04
【问题描述】:

我的问题是我似乎只能单击一次按钮,如果我多次单击它就好像它已经死了。什么都不做。因此,如果我单击它一次,它将文本设置为“Works”。为什么我点击多次时它不保持交替值?

我有以下 C# 代码(我知道我使用了太多命名空间,但请忽略它);

using System;
using System.Collections.Generic;
using System.Data;
using System.Web.Security;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
{
    Label1.Text = "Click to test";
}

protected void Click(object sender, EventArgs e)
{

    if (Label1.Text == "Works")
    {
        Label1.Text = "Try again";
    }

    else
    {
        Label1.Text = "Works";
    }
}
}

这是 ASPX 代码;

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server">
    </asp:ScriptManager>
    <asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <ContentTemplate>
            <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
        </ContentTemplate>
        <Triggers>
            <asp:AsyncPostBackTrigger ControlID="Button1" EventName="Click" />
        </Triggers>
    </asp:UpdatePanel>
    <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Click" /> 

    </form>
</body>
</html>

【问题讨论】:

  • 好像它已经死了?所以你的意思是你看不到标签上的信息变化还是?
  • 点击的时候好像没有发出轻微的点击动画,就像卡住了一样。
  • 您可能需要在更新面板中添加UpdateMode="Conditional",否则它将刷新页面上的任何回发。 (现在你只有一个,但如果你添加更多会很重要)

标签: c# asp.net ajax asp.net-3.5


【解决方案1】:

在您的 Page_Load 中,您需要检查 IsPostBack 如果是回发,则不应设置控制值。

protected void Page_Load(object sender, EventArgs e)
{ 
     if (!IsPostBack)
        Label1.Text = "Click to test";
}

或者在 ajax 更新的情况下,它是 IsAutoPostback(我认为!)

【讨论】:

  • 啊,这有帮助。它与“!IsPostBack”完美配合,但我试图使其成为异步更新。我错过了什么?我不想要回发,我只想更新更新面板(仅包含标签)。有什么建议吗?
  • @cc0:我认为您的触发器需要放在您的 ContentTemplate 代码之前。
  • @Ardman:好建议,我试过了。我尝试使用“!Page.IsCallBack”,但无济于事。还有其他建议吗?
  • @cc0:另一个建议是从 AsyncPostBackTrigger 中删除 EventName
  • @cc0:我实际上刚刚创建了一个新项目并将您的代码复制到其中(ASPX 标题除外)并添加了 Sophie88 的建议,它可以工作。我可以建议你尝试做同样的事情吗?
【解决方案2】:

解决方案是 Sophie88 建议的,但我想添加一些额外的细节来准确解释正在发生的事情。

用户最初请求页面:(IsPostBack 为 false)

  1. 解析了 Aspx 标记:Label1.Text 为“Label”
  2. Page_Load 触发,将 Label1.Text 设置为“点击测试”

用户第一次点击按钮:(IsPostBack 为真)

  1. 解析了 Aspx 标记:Label1.Text 为“Label”
  2. ViewState 恢复,Label1.Text 变为“点击测试”
  3. Page_Load 运行,将 Label1.Text 设置为“点击测试”
  4. Click 方法运行。 Label1.Text == "点击测试",所以 Label1.Text 设置为 "Works"

用户第二次点击按钮:(IsPostBack 为真)

  1. 解析了 Aspx 标记:Label1.Text 为“Label”
  2. ViewState 恢复,Label1.Text 变为“Works”
  3. Page_Load 运行,将 Label1.Text 设置为“点击测试”
  4. Click 方法运行。 Label1.Text == "点击测试",所以 Label1.Text 设置为 "Works"

【讨论】:

    【解决方案3】:

    为什么要在 page_load 中设置 Label1.Text?

    在您的标记中,只需将 Text 属性设置为“点击测试”

      <asp:Label ID="Label1" runat="server" Text="Click to test"></asp:Label>
    

    【讨论】:

      【解决方案4】:

      每次加载页面时,您都将 Label1.Text 设置为“Click to test”(每次显示页面时都会发生 Page_Load),然后触发 click 事件并正确看到标签未设置为“Works”,因此将其设置为“Works”。

      如何解决,请参阅 Sophie88 的回答。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-13
        • 1970-01-01
        • 2011-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-28
        • 1970-01-01
        相关资源
        最近更新 更多