ASP.NET CheckBoxList ListItem提交保存值异常,重开条目崩溃问题
问题成因
- 最核心的原因是取值时错误调用了
ListItem的Text属性而非Value属性:你代码中声明的ListItem的Text属性为了做缩进,前面加了3个 转义空格,一旦误调用Text属性就会返回带前置空格的内容,而你定义的Value本身是不带空格的正确值。 - 打开条目时崩溃的原因是你把错误获取到的带空格的Text值存储到了数据库/存储介质中,回显时用这个带空格的值去匹配
CheckBoxList的Item的Value属性,两边值不匹配找不到对应项,触发索引越界或空引用异常。 - 如果确认当前后台取值代码确实调用的是Value属性,可额外排查两个场景:1.
Page_Load事件中没有加If Not IsPostBack Then判断,每次页面回发都重新初始化了CheckBoxList的项,导致选中状态和值异常;2. 项目中存在全局请求参数处理逻辑,错误修改了CheckBoxList提交的原始值。
修复方案
- 修正取值逻辑:确认所有
CheckBoxList取值的位置都调用Value属性而非Text属性,你贴出的VB代码本身取值逻辑是正确的,检查其他隐式取值、参数传递的代码是否有误取属性的情况。 - 优化前端定义:不要用
做缩进,改用CSS控制选项边距,避免Text属性冗余字符带来的误读问题,修改后的前端代码示例:
<div class="form-group row"> <div class="col-md-12 col-md-offset-1" style="text-align: left; vertical-align: bottom; margin-top: 10px;"> <label for="chkPreFin" style="text-decoration: underline; font-size: larger;">Pre-Finishing:</label> <asp:CheckBoxList ID="chkPrefin" RepeatDirection="Vertical" runat="server" TextAlign="right" CssClass="prefin-list"> <asp:ListItem Value="Special Handling Instructions">Special Handling Instructions</asp:ListItem> <asp:ListItem Value="Spin In Barrett">Spin In Barrett</asp:ListItem> <asp:ListItem Value="Pre-Clean In GreyMills">Pre-Clean In GreyMills</asp:ListItem> <asp:ListItem Value="Separate In Mckenzi">Separate In Mckenzi</asp:ListItem> <asp:ListItem Value="Spin Dry In Holland (No Heat)">Spin Dry In Holland (No Heat)</asp:ListItem> </asp:CheckBoxList> </div> </div>
配套CSS控制缩进:
.prefin-list input { margin-left: 1.5em; }
- 补全回发判断:如果页面初始化时存在绑定
CheckBoxList的代码,一定要包裹在回发判断逻辑中:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load If Not IsPostBack Then ' 此处放置CheckBoxList绑定、页面初始化代码 End If End Sub
- 优化回显逻辑:回显时统一用Value匹配,匹配前对存储的值做Trim处理容错,同时增加空判断避免崩溃,示例代码:
' 假设从存储中读取到的历史值存到prefinSaved变量中 Dim prefinValues As String() = prefinSaved.Trim("|"c).Split("|"c) For Each val As String In prefinValues Dim item = chkPrefin.Items.FindByValue(val.Trim()) If item IsNot Nothing Then item.Selected = True End If Next
- 清理历史脏数据:对已经存储到数据库中的带前置空格的脏数据做批量更新,去掉多余的前后空格,确保和Value定义一致。
内容的提问来源于stack exchange,提问作者Mr.Skellington
相关产品推荐
相关产品推荐

