ASP.NET C#实现服务器端等待用户输入后执行后续逻辑
问题分析与代码修正
原代码存在两个核心问题:
- 语法错误:
Process方法定义在Done方法内部,不符合C#语法;Any方法的lambda表达式写法错误,缺少=>。 - 逻辑错误:HTTP是无状态的请求-响应模式,服务器端无法暂停执行等待前端用户输入,必须拆分流程为两次请求:第一次检测需要弹窗并保存状态,第二次提交用户输入完成后续处理。
后端C#代码修正
protected void Done(object sender, EventArgs e) { // 判断是否是用户输入后的二次提交 if (!string.IsNullOrEmpty(hiddenArea.Value)) { // 从Session取出之前保存的状态 MyClass c = Session["CurrentMyClass"] as MyClass; Mywebservice webservice = new Mywebservice(); // 根据实际情况实例化webservice if (c != null) { string requiredArea = Session["RequiredArea"] as string; int areaVal = 0; if (int.TryParse(hiddenArea.Value, out areaVal) && areaVal > 0) { // 根据需要处理的区域类型添加Details if (requiredArea == "area1" || requiredArea == "both") { c.Details.Add(new Detail() { Name = "area1", Value = areaVal }); } if (requiredArea == "area2" || requiredArea == "both") { c.Details.Add(new Detail() { Name = "area2", Value = areaVal }); } } // 调用webservice完成数据库操作 webservice.Complete(this.CaseId); // 清理Session状态 Session.Remove("CurrentMyClass"); Session.Remove("RequiredArea"); hiddenArea.Value = string.Empty; return; } } // 第一次提交,检查是否需要弹窗 MyClass currentC = new MyClass(); // 假设已初始化好currentC的Section数据 Mywebservice currentWebservice = new Mywebservice(); bool needArea1 = currentC.Section.Elements.Any(element => element.SectionName == "area1"); bool needArea2 = currentC.Section.Elements.Any(element => element.SectionName == "area2"); if (needArea1 || needArea2) { // 保存当前上下文到Session Session["CurrentMyClass"] = currentC; if (needArea1 && needArea2) { Session["RequiredArea"] = "both"; } else if (needArea1) { Session["RequiredArea"] = "area1"; } else { Session["RequiredArea"] = "area2"; } // 注册弹窗脚本 ClientScript.RegisterStartupScript(this.GetType(), "ShowPopup", "showAreaPopup();", true); return; } // 无需弹窗,直接调用webservice currentWebservice.Complete(this.CaseId); } // 修正后的独立Process方法(按需保留) private void Process(MyClass c, Mywebservice webservice) { int MyArea1 = 0; if (int.TryParse(hiddenArea.Value, out MyArea1) && MyArea1 > 0) { c.Details.Add(new Detail() { Name = "area1", Value = MyArea1 }); } int MyArea2 = 0; if (int.TryParse(hiddenArea.Value, out MyArea2) && MyArea2 > 0) { c.Details.Add(new Detail() { Name = "area2", Value = MyArea2 }); } webservice.Complete(this.CaseId); }
前端JS代码修正
修改captureAreaVal函数,保存用户输入后触发页面二次提交,让服务器端继续处理后续逻辑:
function captureAreaVal() { var areaVal = document.getElementById('<%=TxtboxArea.ClientID%>').value; if (areaVal && !isNaN(areaVal) && parseInt(areaVal) > 0) { document.getElementById('<%=hiddenArea.ClientID %>').value = areaVal; closeAreaPopup(); console.log("in captureAreaVal() ", areaVal); // 触发Done按钮的提交事件,继续服务器端流程 __doPostBack('<%=DoneBtn.ClientID%>', ''); // 也可以用按钮点击:document.getElementById('<%=DoneBtn.ClientID%>').click(); } }
关键说明
- 状态保存:用
Session存储MyClass对象和需要处理的区域类型,确保二次提交时能恢复之前的业务上下文。 - 请求拆分:第一次点击Done按钮仅完成弹窗检测与状态保存;用户输入后触发二次提交,完成值赋值与webservice调用。
- 语法修正:
Any方法的正确lambda写法为element => element.SectionName == "area1",原代码缺少=>会导致编译错误。
内容的提问来源于stack exchange,提问作者Ssp
相关产品推荐
相关产品推荐

