C# WinForm计算器转Web Form部署Azure运算异常求助
问题根因
- 该问题不属于.NET/ASP.NET框架故障,是WinForms与WebForms的运行机制差异导致:
- WinForms为桌面应用,窗体实例全程驻留内存,类字段的状态会持续保留
- WebForms属于Web应用,每次点击按钮触发回发时,都会重新实例化当前Page类,你最初定义的
operationPerf、operation、answer三个类级字段,每次回发都会被重置为初始值(false、空字符串、0) - 以3+3为例:输入第一个3后点击+号,回发后
operation被重置为空,switch判断走默认分支未执行计算;再点击第二个3时,operationPerf也被重置为false,文本框不会清空,直接拼接字符3就得到了33的错误结果
代码修正
你后续改用ViewState存储状态的思路是正确的,仅需要调整Page_Load的逻辑:增加!IsPostBack判断,仅在页面首次加载时初始化ViewState,避免回发时覆盖已存储的状态。
修正后的完整代码如下:
using System; using System.Web.UI; using System.Web.UI.WebControls; namespace WebApplication2 { public partial class WebForm1 : Page { protected void Page_Load(object sender, EventArgs e) { // 仅首次加载时初始化状态,回发时不重置 if (!IsPostBack) { ViewState["operationPerf"] = false; ViewState["operation"] = string.Empty; ViewState["answer"] = 0d; textbox.Text = "0"; } } protected void NumbEvent(object sender, EventArgs e) { if (textbox.Text == "0" || (bool)ViewState["operationPerf"]) textbox.Text = string.Empty; Button butt = (Button)sender; textbox.Text += butt.Text; ViewState["operationPerf"] = false; label.Text += " " + textbox.Text; } protected void OperandEvent(object sender, EventArgs e) { ViewState["operationPerf"] = true; Button butt = (Button)sender; string newOperand = butt.Text; label.Text += " " + newOperand; double answer = (double)ViewState["answer"]; double currentNum = double.Parse(textbox.Text); switch (ViewState["operation"].ToString()) { case "+": textbox.Text = (answer + currentNum).ToString(); break; case "-": textbox.Text = (answer - currentNum).ToString(); break; case "*": textbox.Text = (answer * currentNum).ToString(); break; case "/": textbox.Text = (answer / currentNum).ToString(); break; case "^": textbox.Text = Math.Pow(answer, currentNum).ToString(); break; case "√": textbox.Text = Math.Sqrt(currentNum).ToString(); break; default: break; } ViewState["answer"] = double.Parse(textbox.Text); ViewState["operation"] = newOperand; } protected void Bequal_Click(object sender, EventArgs e) { ViewState["operationPerf"] = true; double answer = (double)ViewState["answer"]; double currentNum = double.Parse(textbox.Text); switch (ViewState["operation"].ToString()) { case "+": textbox.Text = (answer + currentNum).ToString(); break; case "-": textbox.Text = (answer - currentNum).ToString(); break; case "*": textbox.Text = (answer * currentNum).ToString(); break; case "/": textbox.Text = (answer / currentNum).ToString(); break; case "^": textbox.Text = Math.Pow(answer, currentNum).ToString(); break; case "√": textbox.Text = Math.Sqrt(currentNum).ToString(); break; default: break; } label.Text += " = " + textbox.Text; label.Text = ""; ViewState["answer"] = double.Parse(textbox.Text); textbox.Text = ViewState["answer"].ToString(); ViewState["answer"] = 0d; ViewState["operation"] = ""; } protected void BC_Click(object sender, EventArgs e) { textbox.Text = "0"; label.Text = ""; ViewState["answer"] = 0d; ViewState["operation"] = ""; ViewState["operationPerf"] = false; } } }
部署到Azure的补充说明
Web Forms应用可直接部署到Azure应用服务,部署时选择对应.NET框架版本即可正常运行,无需额外适配。
内容的提问来源于stack exchange,提问作者Liamw
相关产品推荐
相关产品推荐

