把页面表单状态记录到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 ? "" : ""); break;
case "RadioButton": HiddenFieldForOriginal.Add(id, ((RadioButton)control).Checked ? "" : ""); 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页面表单初始状态(主要是为了前台可以根据这个判断页面是否变动了)的更多相关文章

  1. html前端如何将一个页面表单内的数据全部传递到另一个页面?

    http://blog.csdn.net/stone_tomcate/article/details/64148648?winzoom=1

  2. html 页面表单如果是disabled,则不能提交到服务器端,request.getParameter得到的将为null

    html 页面表单如果是disabled,则不能提交到服务器端,request.getParameter得到的将为null 解决方法:使用hidden 利用javascript赋值,传递到后台

  3. 把JSON数据载入到页面表单的两种思路(对easyui自带方法进行改进)

    #把JSON数据载入到页面表单的两种思路(对easyui自带方法进行改进) ##背景 项目中经常需要把JSON数据填充到页面表单,一开始我使用easyui自带的form load方法,觉得效率很低,经 ...

  4. SpringMVC接收页面表单参数-java-电脑编程网

    body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...

  5. 使用JQuery.Validate插件来校验页面表单有效性

    使用JQuery.Validate插件来校验页面表单有效性​1. [代码] 常见的注册表单元素 <form action="#" method="post" ...

  6. JavaScript学习——使用JS完成注册页面表单校验

    1.步骤分析 第一步:确定事件(onsubmit)并为其绑定一个函数 第二步:书写这个函数(获取用户输入的数据<获取数据时需要在指定位置定义一个 id>) 第三步:对用户输入的数据进行判断 ...

  7. HTML 之 Web页面表单form中只有一个input的text元素,按回车默认提交

    WEB开发中,如果页面的 form 中只有一个input元素,在该input元素的输入框中按回车(注:此时并没有写对应的onkeydown等事件处理),则浏览器会默认提交表单,请看如下代码: < ...

  8. JS实现给页面表单设置触发默认按钮

    var defaultBtnId; function setDefaultButton(id) { defaultBtnId = id; } document.onkeydown = function ...

  9. SpringMVC获取页面表单参数的几种方式

      以下几种方式只有在已搭好的SpringMVC环境中,才能执行成功!      首先,写一个登陆页面和一个Bean类 <%@ page language="java" co ...

随机推荐

  1. EffectiveC#02--仅在对基类进行强制更新时才使用new修饰符

    1.建议避免使用new修饰符来重新定义非虚函数. 非虚方法是静态绑定的,不管哪里的代码也不管在哪里引用, 它总是严格的调用类中所定义的函数.并不会在运行时在 派生类中查找不同的版本. 2.何时使用ne ...

  2. asp.net 页面实践执行顺序

    protected void Page_Load(object sender, EventArgs e) { } #region OnPreInit 第一步 protected override vo ...

  3. 企业qq代码,工作中用到的

    <div id="xixi" onmouseover="toBig()" style="top: 120px; left: 0; positio ...

  4. Code Complete阅读笔记(二)

    2015-03-06   328   Unusual Data Types    ——You can carry this technique to extremes,putting all the ...

  5. JavaScript中String对象的match()、replace() 配合正则表达式使用

    正则表达式由来已久,查找替换功能非常强大,但模板难记复杂. JavaScript中String对象的match().replace()这2个方法都要使用正则表达式的模板.当模板内容与字符串不相匹配时, ...

  6. oracle定时备份与删除N天前备份文件

    oracle定时备份数据库,以及删除7天前备份的数据. 1.创建存放备份目录: mkdir /home/oracle/data_backup mkdir /home/oracle/log_backup ...

  7. iOS 中的正则匹配(工具类方法)

    正则表达式 正则表达式是对字符串操作的一种逻辑公式, 用事先定义好的一些特定字符.及这些特定字符的组合, 组成一个"规则字符串", 这个"规则字符串"用来表达对 ...

  8. jQuery Moblile Demos学习记录Panel

    jQuery Moblile Demos学习记录Panel 11. 二 / Jquery Mobile / 没有评论   本文来源于www.ifyao.com禁止转载!www.ifyao.com 我就 ...

  9. Java的Date类与Calendar类

    一:Date类 在JDK1.0中,Date类是唯一的一个代表时间的类,但是由于Date类不便于实现国际化,所以从JDK1.1版本开始,推荐使用Calendar类进行时间和日期处理.这里简单介绍一下Da ...

  10. 子元素用margin-top 为什么反而作用在父元素上?对使用margin-top 的元素本身不起作用?

    在这个说明中,“collapsing margins”(折叠margin)的意思是:2个或以上盒模型之间(关系可以是相邻或嵌套)相邻的margin属性(这之间不能有非空内容.padding区域.bor ...