如何在C#中的整个Web应用程序中使用变量

时间:2018-11-06 16:24:24

标签: c# asp.net variables webforms

我受命在C#Web应用程序上创建一个计算器,但是我注意到当我使用其他按钮中设置的变量时,程序会将它们设置为0,特别是我分配的“ num”和“ sign”变量在PlusBut中,但实际上在EqualBut中使用它们时,它们被分配为0。我的代码在Windows窗体中工作,但这是我第一次使用网站应用程序。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebApplication1 {
    public partial class About: System.Web.UI.Page {
        int sign;
        double num, num2;

        protected void Page_Load(object sender, EventArgs e) { }

        protected void Button4_Click(object sender, EventArgs e) { }

        protected void But0_Click(object sender, EventArgs e) {

            AnswerBox.Text = AnswerBox.Text + "0";
        }

        protected void But1_Click(object sender, EventArgs e) {
            AnswerBox.Text = AnswerBox.Text + "1";
        }

        protected void But2_Click(object sender, EventArgs e) {
            AnswerBox.Text = AnswerBox.Text + "2";
        }

        protected void But3_Click(object sender, EventArgs e) {
            AnswerBox.Text = AnswerBox.Text + "3";
        }

        protected void But4_Click(object sender, EventArgs e) {
            AnswerBox.Text = AnswerBox.Text + "4";
        }

        protected void But5_Click(object sender, EventArgs e) {
            AnswerBox.Text = AnswerBox.Text + "5";
        }

        protected void But6_Click(object sender, EventArgs e) {
            AnswerBox.Text = AnswerBox.Text + "6";
        }

        protected void But7_Click(object sender, EventArgs e) {
            AnswerBox.Text = AnswerBox.Text + "7";
        }

        protected void But8_Click(object sender, EventArgs e) {
            AnswerBox.Text = AnswerBox.Text + "8";
        }

        protected void But9_Click(object sender, EventArgs e) {
            AnswerBox.Text = AnswerBox.Text + "9";
        }

        protected void PlusBut_Click(object sender, EventArgs e) {
            num = double.Parse(AnswerBox.Text);
            AnswerBox.Text = "";
            sign = 1;

        }

        protected void DecBut_Click(object sender, EventArgs e) {
            AnswerBox.Text = AnswerBox.Text + ".";
        }

        protected void MinusBut_Click(object sender, EventArgs e) {
            num = double.Parse(AnswerBox.Text);
            AnswerBox.Text = "";
            sign = 2;
        }

        protected void MultBut_Click(object sender, EventArgs e) {
            num = double.Parse(AnswerBox.Text);
            AnswerBox.Text = "";
            sign = 3;
        }

        protected void DivButton_Click(object sender, EventArgs e) {
            num = double.Parse(AnswerBox.Text);
            AnswerBox.Text = "";
            sign = 4;
        }

        protected void EqualBut_Click(object sender, EventArgs e) {
            num2 = double.Parse(AnswerBox.Text);
            AnswerBox.Text = "" + num + " " + num2 + " " + sign;
        }
    }
}

3 个答案:

答案 0 :(得分:2)

基本上,当您触发回发(通过单击案例中的按钮)时,将创建About类的新实例,并且字段的先前值也会丢失。

您应该阅读有关ASP Page Life Cycle Events的信息。

有多种使变量持久化的方法,一种是使用SessionViewState变量,这可能是您所用的最简单的解决方案,并且对于计算器来说足够了。

double num1
{
    get { return Convert.ToDouble(ViewState["num1"] ?? 0); }
    set { ViewState["num1"] = value; }
} 

另一种方法是使用JavaScript避免回发,但是通过结合客户端和服务器端操作,这将增加应用程序的复杂性。

答案 1 :(得分:1)

我有点猜测,但是我认为您的问题是Web应用程序不会从一个按钮按下到另一个按钮持续存在。每次用户按下按钮时,浏览器都会向服务器发送请求。服务器创建Web应用程序并向其发出请求,然后该应用程序产生结果。

您需要将一个请求的值持久化到下一个请求。有几种方法可以执行此操作,但是将它们保存到会话中是正常的。确切的植入方法取决于您使用的Web技术。

答案 2 :(得分:0)

ASP.NET是服务器端。因此,每次在客户端触发一次点击时,都会创建一个关于About的新实例,并使用默认值(也称为0)创建sign,num和num2。

要么将JavaScript更改为客户端编程语言,要么将值定义为static。静态变量链接到该类而不是其实例,因此它们将在回调之间保存值:

public partial class About : System.Web.UI.Page
{
    static int sign;
    static double num;
    static double num2;
    /* ... */
    protected void PlusBut_Click(object sender, EventArgs e)
    {
        About.num = double.Parse(AnswerBox.Text);
        AnswerBox.Text = "";
        sign = 1;
    }
}