【发布时间】:2010-04-16 10:47:13
【问题描述】:
谁能尽可能简洁地解释 ViewState(在 ASP.NET 中)?
【问题讨论】:
-
如果您想了解更多信息,请查看 MSDN 文章“了解 ASP.NET 视图状态”msdn.microsoft.com/en-us/library/ms972976.aspx
-
除了“viewstate 在你的所有网页上放置一个讨厌的隐藏字符串”之外?
谁能尽可能简洁地解释 ViewState(在 ASP.NET 中)?
【问题讨论】:
ViewState 是允许跨页面回发保留状态值的机制。
网络是无状态的。但是在 ASP.NET 中,页面的状态是在页面本身中自动维护的。这是使用 ViewState 完成的。在 ViewState 中,值是 base 64 编码并保存在隐藏控件中。
当您查看使用 ViewState 的页面的页面源(在您的浏览器中)时,您可能会看到这个隐藏的 ViewState 输入,如下所示:
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTM1ODM3Nj......." />
这个隐藏字段包含所有页面控件的所有视图状态值。
因为 ViewState(默认情况下)发送到客户端浏览器,然后以页面上隐藏输入控件的形式返回到服务器,所以在 ViewState 中存储大量数据会增加页面大小并可能影响您的页面性能。
要禁用控件的 ViewState,可以将 EnableViewState 属性设置为 false。
【讨论】:
总之,
【讨论】:
来自here:
ViewState 允许将对象的状态(可序列化)存储在页面上的隐藏字段中。 ViewState 被传输到客户端并返回到服务器,而不是存储在服务器或任何其他外部源上。 ViewState 用于在回发之间保留服务器端对象的状态。
【讨论】:
我们首先为 VIEWSTATTE 创建一个函数
dgpayment 是 gridview
private void BindGrid(int rowcount)
{
DataTable dt = new DataTable();
DataRow dr;
dt.Columns.Add(new System.Data.DataColumn("AccName", typeof(String)));
dt.Columns.Add(new System.Data.DataColumn("Remarks", typeof(String)));
if (ViewState["CurrentData"] != null)
{
for (int i = 0; i < rowcount + 1; i++)
{
dt = (DataTable)ViewState["CurrentData"];
if (dt.Rows.Count > 0)
{
dr = dt.NewRow();
dr[0] = dt.Rows[0][0].ToString();
}
}
dr = dt.NewRow();
dr[0] = txtAccntName.Text;
dr[1] = txtRemark.Text;
dt.Rows.Add(dr);
}
else
{
dr = dt.NewRow();
dr[0] = txtAccntName.Text;
dr[1] = txtRemark.Text;
dt.Rows.Add(dr);
}
if (ViewState["CurrentData"] != null)
{
dgPayment.DataSource = (DataTable)ViewState["CurrentData"];
dgPayment.DataBind();
}
else
{
dgPayment.DataSource = dt;
dgPayment.DataBind();
}
ViewState["CurrentData"] = dt;
}
添加按钮添加代码之后
protected void btnADD_Click(object sender, EventArgs e)
{
if (ViewState["CurrentData"] != null)
{
DataTable dt = (DataTable)ViewState["CurrentData"];
int count = dt.Rows.Count;
BindGrid(count);
}
else
{
BindGrid(1);
}
}
【讨论】: