我目前正致力于asp.net webforms
项目,我有一个
asp:textbox
asp:DropDownList
asp:linkbutton
我在同一页面上也有asp:gridview
,每当我点击linkbutton
而不将数据保存到DataBase
时,我需要在其上插入新行即可。
我过去实现这一目标的方法是将数据保存在ViewState
列表中。
所以,我的问题是:难道没有更好的方法吗? 如果是,请详细说明。
更新:PostBack
发生时,我不得丢失gridview数据。
答案 0 :(得分:1)
您正在寻找ASP .NET State Management,有几种方法可以处理它:
由于您没有提供更多信息,我建议您使用会话状态来保存数据,因为这是最简单的方法,因为信息将存储在它所属的服务器端(而不是错误地使用ViewState,其中信息两次到客户端,一个在de GridView.DataBind()中,另一个在ViewState中)。你需要做这样的事情:
MyGridView.Datasource = (List<Object>)Session["myGridViewData"];
MyGridView.DataBind();
无论何时插入/删除/修改新行,都必须更新myGridViewData会话变量中的数据集。
请记住在每次回发时刷新GridView.DataSource,这样你就不会丢失信息:
protected void Page_Load(object sender, EventArgs e)
{
grid1.DataSource = getDataSet();
grid1.DataBind();
}
private List<Object> getDataSet()
{
if (Session["myGridViewData"] == null)
Session["myGridViewData"] = new List<employee>();
return (List<Object>)Session["myGridViewData"];
}
protected void addNewRowButton_Click(object sender, EventArgs e)
{
List<Object> list = (List<Object>)Session["myGridViewData"];
list.Add(new Object ());
Session["myGridViewData"] = list;
}
请记住这不是一个好习惯来更新Page_Load事件的控件,您应该处理哪些回发刷新数据并刷新网格上的方法(页面首次加载,并添加/修改/删除行。)
如果您使用的是.NET Framework 4.5或更高版本,我建议您使用GridView模型绑定(SelectMethod) GridView Model Binding这不是必须在Page_Load方法中明确地刷新每个回发上的DataSource,这是一种更简洁的方法。
编辑:来自here
会话状态或ViewState?
在某些情况下,在ViewState中保存状态值是 不是最好的选择。最常用的替代方案是Session 状态,通常更适合:
大量数据。由于ViewState增加了发送到浏览器的页面(HTML有效负载)和表单大小 回过头来看,它是存储大量数据的不良选择。
保护UI中尚未显示的数据。虽然ViewState数据是经过编码的,但可以选择加密您的数据 如果从未发送给客户端,则最安全。所以,Session状态是 一个更安全的选择。 (将数据存储在数据库中甚至更多 由于其他数据库凭据而安全。您可以为其添加SSL 更好的链接安全性。)但是如果你已经显示了私人数据 在用户界面中,大概你已经对安全性感到满意了 链接本身。在这种情况下,放置它也同样安全 也可以将值转换为ViewState。
对象不容易序列化为ViewState,例如DataSet。 ViewState序列化器针对一小部分进行了优化 常见对象类型,如下所示。其他可序列化的类型 可以在ViewState中持久化,但速度较慢并生成一个 大ViewState足迹。