Ajax Toolkit ComboBox空引用异常(System.NullReferenceException)求助
解决Ajax Toolkit ComboBox权限控制导致的NullReferenceException异常
问题原因
当用户无权限时,前端的cbTest控件因<% if (HasnPermissions) %>条件不成立,根本不会被渲染到页面,后端Page对象里也就不会创建这个控件的实例。直接访问cbTest.Items必然触发空引用异常,而且异常发生在页面生命周期的早期阶段(比如视图状态恢复或AjaxToolkit内部处理环节),所以调试根本进不了cboOwner_SelectedIndexChanged方法。
解决方案
方案1:绑定前先判空(最简单直接)
修改BindCombo方法,先检查控件实例是否存在,再执行绑定逻辑:
private void BindCombo() { // 只有控件实例存在(用户有权限)时才执行绑定 if (cbTest != null) { cbTest.Items.Insert(0, new ListItem("none", "0")); } }
方案2:始终保留控件实例,前端控制显示
把前端的条件渲染改成始终创建控件,用Visible属性控制是否显示。这样不管用户有没有权限,后端都会生成控件实例,避免null引用:
前端代码修改为:
<ajaxToolkit:ComboBox ID="cbTest" runat="server" CssClass="searchContentCombobox" ItemInsertLocation="OrdinalText" Visible='<%# HasnPermissions %>' />
然后在Page_Load里加上数据绑定(因为用了<%# %>表达式):
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { // 其他初始化逻辑... cbTest.DataBind(); } }
方案3:无权限时取消事件绑定
在页面加载早期,判断用户无权限时,移除下拉列表的选中事件绑定,从根源避免执行绑定逻辑:
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { // 初始化逻辑... } // 无权限时,取消下拉列表的选中事件处理 if (!HasnPermissions) { cboOwner.SelectedIndexChanged -= cboOwner_SelectedIndexChanged; } }
验证
给无权限用户测试切换cboOwner选项,不会再抛出NullReferenceException;有权限用户的原有功能完全不受影响。
内容的提问来源于stack exchange,提问作者Ser
相关产品推荐
相关产品推荐

