为了减轻页面负担,在web.conifg里禁用了viewstate。
<pages validateRequest="false" enableViewState="false" styleSheetTheme="Common">
但是在【编辑】页面,发现需要临时存储获得的model。cache或是session都不合适,考虑使用viewstate。请问有没有办法禁用控件的viewstate,但是保留viewstate机制(仅设置所有控件禁用viewstate,例如viewstate["aa"]=XX这样的语法仍旧起作用)。示例代码如下:
public partial class UserTypeUpdate : Common.BasePage { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { LoadInfo(); } } protected void btnSubmit_Click(object sender, EventArgs e) { if (CheckInput()) { BLL.UserTypeService bll = new BLL.UserTypeService(); Model.UserType model = (Model.UserType)ViewState["model"]; model.UserTypeName = this.txtUserTypeName.Text.Trim(); model.IsSys = this.rdlIsSys.SelectedIndex == 0 ? true : false; model.OrderID = int.Parse(this.txtOrderID.Text.Trim()); model.Remarks = this.txtRemarks.Text.Trim(); int i = bll.Update(model); try { if (i == 1) { ClientScript.RegisterStartupScript(ClientScript.GetType(), "javascript", "<script>Success();</script>"); } if (i == -1) { this.lblErrorMessage.Text += "<li>存在重名的人员类别名称,请重新填写!</li>"; ClientScript.RegisterStartupScript(ClientScript.GetType(), "javascript", "<script>Error();</script>"); } } catch (Exception ex) { this.lblErrorMessage.Text += "<li>"+ex.Message+"</li>"; ClientScript.RegisterStartupScript(ClientScript.GetType(), "javascript", "<script>Error();</script>"); } } else { ClientScript.RegisterStartupScript(ClientScript.GetType(), "javascript", "<script>Error();</script>"); } } private void LoadInfo() { if (!string.IsNullOrEmpty(Request.QueryString["id"])&&EasyFast.Common.CheckValue.IsPositiveInteger(Request.QueryString["id"])) { BLL.UserTypeService bll = new BLL.UserTypeService(); Model.UserType model = bll.GetModel(int.Parse(Request.QueryString["id"])); if (model != null) { this.txtUserTypeName.Text = model.UserTypeName; this.rdlIsSys.SelectedValue = model.IsSys.ToString(); this.txtOrderID.Text = model.OrderID.ToString(); this.txtRemarks.Text = model.Remarks; ViewState["model"] = model; } if (UserInfo.UserID != 1) { this.rdlIsSys.Enabled = false; } } else { this.btnSubmit.Enabled = false; } } private bool CheckInput() { bool _result = true; if (string.IsNullOrEmpty(this.txtUserTypeName.Text.Trim())) { _result = false; this.lblErrorMessage.Text += "<li>人员类别名称必填!</li>"; } if (this.txtUserTypeName.Text.Trim().Length > 50) { _result = false; this.lblErrorMessage.Text += "<li>人员类别名称长度最大允许50个字符!</li>"; } if (string.IsNullOrEmpty(this.txtOrderID.Text.Trim())) { _result = false; this.lblErrorMessage.Text += "<li>排序ID必填!</li>"; } if (!EasyFast.Common.CheckValue.IsPositiveInteger(this.txtOrderID.Text.Trim())) { _result = false; this.lblErrorMessage.Text += "<li>排序ID只能是正整数!</li>"; } if (Convert.ToInt32(this.txtOrderID.Text.Trim()) > 999) { _result = false; this.lblErrorMessage.Text += "<li>排序ID最大只能为999!</li>"; } return _result; } }
注意,此model还有其他若干属性没有在页面显示,也不会再该页面进行编辑,所以诸如:
protected void btnSubmit_Click(object sender, EventArgs e) { if (CheckInput()) { BLL.UserTypeService bll = new BLL.UserTypeService(); Model.UserType model = new Model.UserType(); model.UserTypeID = int.Parse(Request.QueryString["id"]); model.UserTypeName = this.txtUserTypeName.Text.Trim(); model.IsSys = this.rdlIsSys.SelectedIndex == 0 ? true : false; model.OrderID = int.Parse(this.txtOrderID.Text.Trim()); model.Remarks = this.txtRemarks.Text.Trim(); int i = bll.Update(model); try { if (i == 1) { ClientScript.RegisterStartupScript(ClientScript.GetType(), "javascript", "<script>Success();</script>"); } if (i == -1) { this.lblErrorMessage.Text += "<li>存在重名的人员类别名称,请重新填写!</li>"; ClientScript.RegisterStartupScript(ClientScript.GetType(), "javascript", "<script>Error();</script>"); } } catch (Exception ex) { this.lblErrorMessage.Text += "<li>"+ex.Message+"</li>"; ClientScript.RegisterStartupScript(ClientScript.GetType(), "javascript", "<script>Error();</script>"); } } else { ClientScript.RegisterStartupScript(ClientScript.GetType(), "javascript", "<script>Error();</script>"); } }
此类的解决办法不做考虑。
直接对控件设置禁用ViewState
直接对控件禁用ViewState的话,需要在每个控件上都设置,工作量太大。不合适。
@快乐鸟: 对控件禁用ViewState的,不一定需要在每个控件上都设置!
你为什么没不用ajax呢
试试
<%@ Page Language="C#" EnableViewState="true" %>
打开以后,控件就有了viewstate,与本意不符。原本目的是想达到禁用控件的viewstate,但是仍旧保留viewstate机制。
@快乐鸟: ViewState机制本来就是与控件绑定的
@dudu: ViewState["xxx"] = model
这个语法并没有和控件绑定啊?控件有viewstate,但不是说viewstate只是控件的某种属性。
可以把viewstate保存到服务器上,因为页面中的viewstate只在服务器上使用,页面没用
viewstate可以保存在服务器上?求教。
@快乐鸟: 方法有很多,问下度娘。这是其中一个方法 http://www.cnblogs.com/cnblogsfans/archive/2008/11/20/1337781.html
再查一次数据库怎么样?
Model.UserType model = bll.GetModel(int.Parse(Request.QueryString["id"]));
然后需要改变的值重新赋值。viewstate序列化其实也挺慢的。
或者像别人所说的用ajax post 。
再查一次数据会存在诸多问题:
1、并发问题,每个model是包含timestamp,重新获取model以后,就没法根据timestamp判断数据是否修改过,从而没法控制并发访问问题。
2、性能,反复的获取model对数据库的压力过大。
对那些只是显示性的页面禁用viewState
请,请注意看问题描述。