先看看我的问题吧。进行“修改牛腩系统新闻”模块时,新闻这个表中的字段(新闻类别,新闻标号,新闻标题,新闻内容)除了新闻标号不可以修改,其他都是可以更改的。修改新闻界面如下:
页面上缺少新闻标号,我们要进行新闻修改是,要根据新闻标号进行修改,怎么办?
我们可以从新闻列表页跳转过来的时候,就把“新闻标号”赋值给一个全局变量。
思路:在form 中定义了一个全局变量,
//全局变量,新闻标号
//string newsid;
在页面load中给变量赋值: protected void Page_Load(object sender, EventArgs e)
{
//给变量赋值
newsid = dtNews.Rows[0][0].ToString();
}
在“修改新闻”事件中调用:
protected void btnupdate_Click(object sender, EventArgs e)
{
updateflag = new NewsManage().Update(newsid);
}
结果发现:加载的时候newid的值确实被赋值了,但是但我们再次触发“修改新闻”按钮时,页面刷新,newsid的值消失了,所以,我们单纯的使用全局变量达不到我们的目的。
那我们只好换方法了。我们可以通过以下四种来实现。
第一种:将全局变量换成“Static”。
//静态变量,新闻标号
//static string newsid;
接下来的复制,调用,同上。
第二种:使用viewstatic。
首先:什么是viewstatic?
ViewState是ASP.NET中用来保存WEB控件回传时状态值一种机制。在WEB窗体(FORM)的设置为runat="server",这个窗体(FORM)会被附加一个隐藏的属性_VIEWSTATE。_VIEWSTATE中存放了所有控件在ViewState中的状态值。
ViewState是类Control中的一个域,其他所有控件通过继承Control来获得了ViewState功能。它的类型是system.Web.UI.StateBag,一个名称/值的对象集合。当请求某个页面时,ASP.NET把所有控件的状态序列化成一个字符串,然后做为窗体的隐藏属性送到客户端。当客户端把页面回传时,ASP.NET分析回传的窗体属性,并赋给控件对应的值。
使用:1、不需要在form 中定义变量:在页面load中给变量赋值:
protected void Page_Load(object sender, EventArgs e)
{
//第二种:页面级的变量,只要页面不消失,就存在
//ViewState["newsid"] = dtNews.Rows[0][0].ToString();
}
protected void btnupdate_Click(object sender, EventArgs e)
{
Newsid = ViewState["newsid"].ToString();
updateflag = new NewsManage().Update(Newsid);
}
第三种:使用session。
与第二种viewstate的使用是一样的。只是把viewstate换成session即可。
第四种:使用asp.net 隐藏属性:hiddenfield。
1、要在前台页面中定义hiddenfield属性。
<!--隐藏属性-->
<asp:HiddenField ID="newsid" Value ="" runat="server" />
2、在后台页面中复制:
protected void Page_Load(object sender, EventArgs e)
{
//第四种:使用属性:在前台页面中定义
newsid.Value = dtNews.Rows[0][0].ToString();
}
3、调用:
protected void btnupdate_Click(object sender, EventArgs e)
{
Newsid = newsid.Value ;
updateflag = new NewsManage().Update(Newsid);
}
以上方法都可以使用成功,第四种的隐藏属性不经常使用。
Viewstate和Session的使用区别:简单点说,session值是保存在服务器内存上,那么,可以肯定,大量的使用session将导致服务器负担加重.而viewstate由于只是将数据存入到页面隐藏控件里,不再占用服务器资源,因此,我们可以将一些需要服务器"记住"的变量和对象保存到viewstate里面.而sesson则只应该应用在需要跨页面且与每个访问用户相关的变量和对象存储上.另外,session在默认情况下20分钟就过期,而viewstate则永远不会过期.
但viewstate并不是能存储所有的.net类型数据,它仅仅支持String、Integer、Boolean、Array、ArrayList、Hashtable以及自定义的一些类型.
发现只要下决心,解决一个问题,总会有藏不住的方法。