C# 委托不在asp.net中工作
我很难让我的代表去工作。基本上我希望它能正常工作,这样当用户第一次点击按钮时,标签会显示第三名的司机,当他们第二次点击按钮时,标签将被清除,排在第二位的车手将显示在其位置,最后当他们第三次点击按钮时,将显示比赛的获胜者 这是aspx.cs页面C# 委托不在asp.net中工作,c#,asp.net,C#,Asp.net,我很难让我的代表去工作。基本上我希望它能正常工作,这样当用户第一次点击按钮时,标签会显示第三名的司机,当他们第二次点击按钮时,标签将被清除,排在第二位的车手将显示在其位置,最后当他们第三次点击按钮时,将显示比赛的获胜者 这是aspx.cs页面 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.We
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace WebProgramming3.Week_3
{
public partial class Exercise1 : System.Web.UI.Page
{
static RaceResult UserClick;
//public int Clicks = 0;
protected void Page_Load(object sender, EventArgs e)
{
UserClick = new RaceResult(0);
UserClick.NbrClicksReached += User_Click_NbrClicksReached;
}
private void User_Click_NbrClicksReached(string message)
{
lblRaceResults.Text += message;
}
protected void btnRace_Click(object sender, EventArgs e)
{
UserClick.BtnClicks++;
}
}
public delegate void StringDelegate(string message);
public class RaceResult
{
public int BtnClicks { get; set; }
//Delegate
public event StringDelegate NbrClicksReached;
public RaceResult( int btnclicks)
{
BtnClicks = btnclicks;
}
public void Add(int amount)
{
if (BtnClicks == 1)
{
if (NbrClicksReached != null)
NbrClicksReached("In 3rd place is Kimi Räikkönen");
}
if (BtnClicks == 2)
{
if (NbrClicksReached != null)
NbrClicksReached("In 2nd place is Sebastian Vettel");
}
if (BtnClicks >= 3)
{
if (NbrClicksReached != null)
NbrClicksReached("In 1st place is Lewis Hamilton");
}
}
}
}
这是我的aspx页面
<body>
<form id="form1" runat="server">
<div>
<asp:Button ID="btnFeed" OnClick="btnRace_Click" runat="server" Text="Button" />
<asp:Label ID="lblRaceResults" runat="server" Text="Label"></asp:Label>
</div>
</form>
</body>
如果我的问题不清楚,请随时提出更多问题 您的代码有一些问题。首先,在
Page\u Load
事件中,您不保护全局变量的初始化不受回发的影响。每次在服务器上运行事件(runat=server)时,在控件中声明的事件之前执行Page\u Load
事件,因此每次都重新初始化racesult
变量。此外,静态变量在Web应用程序中不是一个好概念,例如,请参见以下非常好的问题/答案: 因此,重写页面的初始部分是必要的
public partial class Exercise1 : System.Web.UI.Page
{
private RaceResult UserClick;
//public int Clicks = 0;
protected void Page_Load(object sender, EventArgs e)
{
// First page load?
if(!IsPostBack)
{
UserClick = new RaceResult(0);
UserClick.NbrClicksReached += User_Click_NbrClicksReached;
Session["UserClick"] = UserClick;
}
else
{
// Get from first load
UserClick = Session["UserClick"];
if(UserClick == null)
{
UserClick = new RaceResult(0);
UserClick.NbrClicksReached += User_Click_NbrClicksReached;
Session["UserClick"] = UserClick;
}
}
}
现在,应该调用委托的部分令人困惑。UserClick.Add
方法调用委托,但您不调用UserClick.Add方法,在显示的代码页面中的任意位置添加。此外,传递给此方法的整数未在其内部使用,因此它似乎没有用处,可以删除。反正
protected void btnRace_Click(object sender, EventArgs e)
{
// Should not be required but....
if(UserClick != null)
{
UserClick.BtnClicks++;
// The integer is meaningless in the context of your code above
// It could be removed because the Add logic is driven
// by BtnClicks value
UserClick.Add(0);
}
}
问题很清楚。您尚未阅读ASP.Net中的页面生存期。您是否知道,每次单击按钮时,页面加载事件都会在单击事件之前执行?我仍然不确定我应该怎么做,我应该在我的页面加载中添加一个“if(!IsPostBack)”吗?