记录ASP.NET页面表单初始状态(主要是为了前台可以根据这个判断页面是否变动了)
把页面表单状态记录到HiddenField中.
这里只提供后台代码, 前台逻辑根据需求自由定义.
存放值的ViewState:
protected Dictionary<string, string> HiddenFieldForOriginal { get { var data = ViewState["HiddenFieldForOriginal"]; if (data == null) { Dictionary<string, string> ndata = new Dictionary<string, string>(); ViewState["HiddenFieldForOriginal"] = ndata; } return (Dictionary<string, string>)ViewState["HiddenFieldForOriginal"]; } }
记录表单原始值:
protected void SaveOriginalData(Control control, bool childVisible) { if (control != null) { if (control.HasControls()) //有子控件, 往下遍历. { foreach (Control item in control.Controls) { if (control.Parent.Visible) { SaveOriginalData(item, control.Visible); } else { ////这里逻辑是: 父控件是隐藏的, 子控件也就不记录了. SaveOriginalData(item, control.Parent.Visible); } } } else { string name = control.GetType().Name; string id = control.ClientID + "HiddenField"; if (name == "TextBox" || name == "DropDownList" || name == "CheckBox" || name == "RadioButton") { if (childVisible) { if (!HiddenFieldForOriginal.Keys.Contains(id)) { switch (name) { case "TextBox": HiddenFieldForOriginal.Add(id, ((TextBox)control).Text); break; case "DropDownList": HiddenFieldForOriginal.Add(id, ((DropDownList)control).SelectedValue); break; case "CheckBox": HiddenFieldForOriginal.Add(id, ((CheckBox)control).Checked ? "1" : ""); break; case "RadioButton": HiddenFieldForOriginal.Add(id, ((RadioButton)control).Checked ? "1" : ""); break; default: break; } } } else { if (HiddenFieldForOriginal.Keys.Contains(id)) HiddenFieldForOriginal.Remove(id); } } } } }
以下代码可以放在渲染前事件里面:

Panel defaultPanel = defaultUpdatePanel.FindControl("DefaultPanel") as Panel; if (defaultPanel != null) { SaveOriginalData(defaultPanel, defaultPanel.Visible); foreach (var c in HiddenFieldForOriginal) { if (!string.IsNullOrEmpty(c.Key)) { HiddenField hiddenField = null; try { hiddenField = new HiddenField(); hiddenField.ID = c.Key; hiddenField.ClientIDMode = System.Web.UI.ClientIDMode.Static; hiddenField.ViewStateMode = System.Web.UI.ViewStateMode.Disabled; hiddenField.Value = c.Value; defaultPanel.Controls.Add(hiddenField); } finally { if (hiddenField != null) hiddenField.Dispose(); } } } }
分类:
ASP.NET
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构