Проблема с очень простым приложением ASP.NET 3.5, использующим C # - PullRequest
1 голос
/ 02 марта 2010

Моя проблема в том, что я могу только нажать кнопку один раз, если я нажимаю несколько раз, как будто она мертва. Ничего не делает Поэтому, если я щелкну по нему один раз, он установит текст «Работает». Почему при многократном нажатии я не чередую значения?

У меня есть следующий код 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>

Ответы [ 4 ]

7 голосов
/ 02 марта 2010

В вашей Page_Load вам нужно проверить IsPostBack Если это постбэк, вы не должны устанавливать контрольное значение.

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

Или в случае обновления ajax, это IsAutoPostback (я думаю!)

6 голосов
/ 02 марта 2010

Решение - это то, что предложил Sophie88, но я хотел добавить некоторые дополнительные детали, чтобы точно объяснить, что происходит.

Пользователь изначально запрашивает страницу: (IsPostBack имеет значение false)

  1. Разметка Aspx проанализирована: Label1.Text is "Label"
  2. Page_Load срабатывает, устанавливает Label1.Text на «Click to test»

Пользователь нажимает кнопку в первый раз: (IsPostBack имеет значение true)

  1. Разметка Aspx анализируется: Label1.Text - это "Label"
  2. ViewState восстановлен, Label1.Text становится "Нажмите, чтобы проверить"
  3. Page_Load запускается, устанавливает Label1.Text на «Click to test»
  4. Запускается метод Click. Label1.Text == "Нажмите, чтобы проверить", поэтому для Label1.Text установлено значение "Works"

Пользователь нажимает кнопку во второй раз: (IsPostBack имеет значение true)

  1. Разметка Aspx анализируется: Label1.Text - это "Label"
  2. ViewState восстановлен, Label1.Text становится "Works"
  3. Page_Load запускается, устанавливает Label1.Text на «Click to test»
  4. Запускается метод Click. Label1.Text == "Нажмите, чтобы проверить", поэтому для Label1.Text установлено значение "Works"
2 голосов
/ 02 марта 2010

Почему вы устанавливаете Label1.Text в page_load?

В вашей разметке просто установите свойство Text на «Click to test»

  <asp:Label ID="Label1" runat="server" Text="Click to test"></asp:Label>
1 голос
/ 02 марта 2010

Каждый раз, когда вы загружаете страницу, для которой вы устанавливаете Label1.Text на «Click to test» (Page_Load происходит каждый раз, когда отображается страница), тогда событие click срабатывает и правильно видит, что метка не установлена «Работает» и поэтому устанавливает его на «Работает».

Как это исправить, см. Ответ Софи88.

...