可恶的ViewState_可恶的DropDownList

DropDownList问题解决
本文解决ASP.NET中DropDownList在不同场景下出现的问题,包括SelectedValue始终为第一项及禁用ViewState后的值丢失问题,并提供替代方案。

这几天在写一个网上商城的例子,其中商品添加和编辑页面用到了DropDownList,在操作DropDownList时遇到了几个问题:

(1)若在Page_Load中绑定DropDownList,则它的SelectedValue会始终为列表中的第一项(不知道为什么,可能与页的生命周期等有关,不懂。。),我的解决方法是改在Page_PreRender中绑定,代码示例:

protected void Page_PreRender(object sender, EventArgs e)
        {
            DataAccess DataAs = new DataAccess();
            DataTable DT = DataAs.CreateDataTable("select * from Categories");
            selCatetories.DataSource = DT;
            selCatetories.DataTextField = "name";
            selCatetories.DataValueField = "category_id";
            selCatetories.DataBind();
        }

这样SelectedValue就没问题了

(2)在禁用了页面的ViewState之后,DropDownList的SelectedValue始终为空,我的解决方法是不使用DropDownList控件而改为用html表单控件select,并添加一type=hidden的input控件,然后添加javascript代码,代码示例:

<script type="text/javascript">
        $(function() {
            var selValue = $("#selCatetories").val();
            $("#curValue").val(selValue);
            //            alert($("#curValue").val());
            $("#selCatetories").change(function() {
                var selValue = $(this).val();
                //                alert(selValue);
                $("#curValue").val(selValue);
                //                alert($("#curValue").val());
            });
        })
    </script>

 

select和hidden:

<input type="hidden" id="curValue" runat="server" />
<select id="selCatetories" runat="server" style="width: 153px;"></select>
(我想其实DropDownList的原理估计也就是这样了)

 

这样问题就全部解决了(其实解决他们花了我好长时间)。ol......

 

另外还有一些值得记录的知识点:

(1)_____禁用ViewState之后DataPager、DropDownList等好多服务器控件都不能用了,还有如果用visible等于false的textbox控件保存值也会失效

(2)_____无刷新分页 在$.post()外找不到动态生成的元素

(3)_____控制repeater的显示方式
protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {
           if (e.Item.DataItem != null)
            {
                if ((e.Item.ItemIndex + 1) % 3 == 0)
                {
                    e.Item.Controls.Add(new LiteralControl("</tr><tr><td colspan=3><hr /></td></tr><tr>"));

                }
            }

        }
(4)_____sql中的like匹配查询也不能用动态sql,如select item_id,name,base_price,small_image_url from [Items] where name like '%@name%',这样是不行的

(5)_____html控件select也能通过设置它的runat=server来在c#代码中用datasource的方式绑定,但是如果禁用了viewstate还是无法取得它的value(selectedvalue) 所以说viewstate是个大问题

### ASP.NET 中 __VIEWSTATE 的作用功能 __VIEWSTATE 是 ASP.NET 提供的一种机制,用于保存页面及其控件的状态信息。它允许开发者在多个往返过程中保持表单的数据一致性,从而使得用户交互更加流畅自然。 #### 1. ViewState 的基本概念 当一个 Web 页面被加载到浏览器时,如果启用了 ViewState 功能,则该页面上的所有服务器端控件的状态都会被序列化为字符串形式,并作为一个名为 `_VIEWSTATE` 的隐藏字段嵌入 HTML 文档中传递至客户端[^2]。这一过程由 ASP.NET 自动完成,对于开发人员而言几乎是透明的。 #### 2. 数据恢复流程 当用户提交表单或将更改后的数据送回到服务器时,ASP.NET 将解析此隐藏字段的内容,并将其反序列化还原成原始对象结构。随后,这些已恢复的信息会被重新分配给相应的控件实例,确保它们能够反映之前的操作结果或显示状态[^1]。 #### 3. 配置选项与安全性考虑 为了进一步加强应用的安全性效率控制,在 web.config 文件中可以通过特定节点设定有关 ViewState 行为的各项参数。例如启用 MAC 校验 (`enableViewStateMac`) 来防止恶意修改;以及指定加密模式 (`viewStateEncryptionMode`) 等等[^3]: ```xml <configuration> <system.web> <pages enableViewStateMac="true" viewStateEncryptionMode="Always"> </pages> </system.web> </configuration> ``` 这样的配置有助于保护敏感数据不受未授权访问的影响,同时也减少了潜在风险的发生概率。 #### 4. 减少不必要的开销 尽管 ViewState 能够极大地方便跨请求间共享复杂数据模型的任务处理需求,但它也可能成为性能瓶颈之一特别是当涉及大量动态更新内容的情况下。因此合理管理其大小非常重要。一种常见做法就是针对那些不需要持久化的部分禁用相应控件级别的 ViewState 支持(`EnableViewState=False`) ,这样既保留了必要特性又能优化资源利用率[^4]。 综上所述,__VIEWSTATE 不仅承担着维持界面稳定性的重任,还提供了灵活可扩展的应用场景支持. --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值