【问题标题】:Using a Timer post back, which controller to use that doesn't post back to server?使用计时器回发,使用哪个控制器不会回发到服务器?
【发布时间】:2010-07-14 07:12:27
【问题描述】:

作为 ASP.NET 的新手,我在构建自己的 Whack-a-mole 程序时遇到了麻烦。我认为我的问题来自使用 Buttons,它自己将帖子发送回服务器,使软件无法使用。外观就位,使新按钮随机出现在网格中的不同位置。然而,当一个按钮被按下时——分数并没有改变(我觉得这很奇怪)。

不奇怪的是,Button 不起作用,因为它将 post 发送回服务器 - 重新加载 UpdatePanel。我想我应该使用一个不同的控制器,比如 CheckBox 并使用 CSS 设置它的样式(这不是问题)。这是正确的方法吗,还是应该改用 JavaScript AJAX?

自我注意:这种技术不应该在公共应用程序中使用,因为它会给 Web 服务器带来太多不必要的压力。仅用于测试和学习!

感谢聆听!

<%@ Page Language="C#" MasterPageFile="~/MasterPage.master" 
    AutoEventWireup="true" CodeFile="Whack-a-mole.aspx.cs" 
    Inherits="Whack_a_mole" %>

<asp:Content ID="Content" ContentPlaceHolderID="cphContent" runat="server">
            <h1>Whack-a-Mole</h1>

    <asp:ScriptManager ID="smgrTime" runat="server" />
    <asp:Timer ID="Timer" OnTick="Timer_Tick" runat="server" Interval="2000" />
    <asp:UpdatePanel ID="updpButtons" runat="server" UpdateMode="Always">
        <Triggers>
            <asp:AsyncPostBackTrigger ControlID="Timer" />
        </Triggers>

        <ContentTemplate>
            <asp:Label ID="lblPoints" runat="server" Text="Score: 0p" />
            <asp:Button ID="Button1" runat="server" BorderStyle="Outset"
                BorderWidth="3px" CssClass="mole" Text="Mole" 
                onclick="Button1_Click" />
            <asp:Button ID="Button2" runat="server" BorderStyle="Outset"
                BorderWidth="3px" CssClass="mole" Text="Mole" 
                onclick="Button2_Click" />
            <asp:Button ID="Button3" runat="server" BorderStyle="Outset"
                BorderWidth="3px" CssClass="mole" Text="Mole" 
                onclick="Button3_Click" />

            <!-- continues the same way down to Button25 -->

            <asp:Button ID="Button25" runat="server" BorderStyle="Outset"
                BorderWidth="3px" CssClass="mole" Text="Mole" 
                onclick="Button25_Click" />
        </ContentTemplate>
    </asp:UpdatePanel>

</asp:Content>

代码文件摘录:

// points vairable
private int points;

// Property for points
public int Points
{
    get { return points; }
    set { points = value; }
}

protected void Timer_Tick(object sender, EventArgs e)
{
    Random random = new Random();
    int visible;

    foreach (Button button in buttonList)
    {
        visible = random.Next(1, 10);
        if (visible == 3)
            button.Visible = true;
        else
            button.Visible = false;
    }
    lblPoints.Text = "Score: " + Points + " p";
}

protected void Button1_Click(object sender, EventArgs e)
{
    Points = Points + 1;
}

【问题讨论】:

    标签: c# asp.net button postback


    【解决方案1】:

    您的 Points 变量在哪里声明?

    我认为它可能是 Whack_a_mole WebForm 类的成员,这就是它不更新的原因。 WebForm的实例只用于1次Postback,然后就被销毁了。

    但更重要的是,对于这样的游戏,您应该使用 JavaScript 或 SilverLight。

    【讨论】:

    • 我已将 points 变量和属性添加到上面的源代码中。我同意使用 JavaScript 或 Silverlight 来代替,但这仅用于测试。谢谢你的回答。如果我将 Button-click 更改为:protected void Button1_Click(object sender, EventArgs e) { int point = int.Parse(lblPoints.Text);点++; lblPoints.Text = point.ToString();它适用于一只痣 - 然后必须等待一个新的 timer_tick。感谢您的努力
    • @Benny:再读一遍那部分。每次回发都会生成一个新变量“Points”。使用 Session 对象来存储用户数据。
    • @Henrik 如果它是概念上的 PHP 应用程序 $_SESSION['points'];我明白你的意思。感谢您的提醒! BR
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-18
    • 1970-01-01
    相关资源
    最近更新 更多