首页 新闻 会员 周边

求一个viewState的设置技巧

0
[待解决问题]

为了减轻页面负担,在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>");
            }
        }

此类的解决办法不做考虑。

快乐鸟的主页 快乐鸟 | 初学一级 | 园豆:7
提问于:2013-09-17 15:34
< >
分享
所有回答(6)
0

直接对控件设置禁用ViewState

Albert Fei | 园豆:2102 (老鸟四级) | 2013-09-17 16:53

直接对控件禁用ViewState的话,需要在每个控件上都设置,工作量太大。不合适。

支持(0) 反对(0) 快乐鸟 | 园豆:7 (初学一级) | 2013-09-18 14:45

@快乐鸟: 对控件禁用ViewState的,不一定需要在每个控件上都设置!

支持(0) 反对(0) Albert Fei | 园豆:2102 (老鸟四级) | 2013-09-19 12:42
0

你为什么没不用ajax呢

ExploreForward | 园豆:18 (初学一级) | 2013-09-17 16:57
0

试试

<%@ Page Language="C#" EnableViewState="true" %>
dudu | 园豆:31003 (高人七级) | 2013-09-17 17:19

打开以后,控件就有了viewstate,与本意不符。原本目的是想达到禁用控件的viewstate,但是仍旧保留viewstate机制。

支持(0) 反对(0) 快乐鸟 | 园豆:7 (初学一级) | 2013-09-18 14:46

@快乐鸟: ViewState机制本来就是与控件绑定的

支持(0) 反对(0) dudu | 园豆:31003 (高人七级) | 2013-09-18 14:57

@dudu: ViewState["xxx"] = model

 

这个语法并没有和控件绑定啊?控件有viewstate,但不是说viewstate只是控件的某种属性。

支持(0) 反对(1) 快乐鸟 | 园豆:7 (初学一级) | 2013-09-26 00:17
0

可以把viewstate保存到服务器上,因为页面中的viewstate只在服务器上使用,页面没用

卒子 | 园豆:588 (小虾三级) | 2013-09-17 17:37

viewstate可以保存在服务器上?求教。

支持(0) 反对(0) 快乐鸟 | 园豆:7 (初学一级) | 2013-09-18 14:46

@快乐鸟: 方法有很多,问下度娘。这是其中一个方法 http://www.cnblogs.com/cnblogsfans/archive/2008/11/20/1337781.html

支持(0) 反对(0) 卒子 | 园豆:588 (小虾三级) | 2013-09-22 15:42
0

再查一次数据库怎么样?

Model.UserType model = bll.GetModel(int.Parse(Request.QueryString["id"]));

然后需要改变的值重新赋值。viewstate序列化其实也挺慢的。

或者像别人所说的用ajax post 。

|WinKi| | 园豆:669 (小虾三级) | 2013-09-17 17:55

再查一次数据会存在诸多问题:

  1、并发问题,每个model是包含timestamp,重新获取model以后,就没法根据timestamp判断数据是否修改过,从而没法控制并发访问问题。

  2、性能,反复的获取model对数据库的压力过大。

支持(0) 反对(0) 快乐鸟 | 园豆:7 (初学一级) | 2013-09-18 15:42
0

对那些只是显示性的页面禁用viewState

wolfy | 园豆:2636 (老鸟四级) | 2013-09-18 23:50

请,请注意看问题描述。

支持(0) 反对(0) 快乐鸟 | 园豆:7 (初学一级) | 2013-09-26 00:17
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册