You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB.NET如何阻止标准用户选择ComboBox中的SPECIAL LEAVE选项

实现方案

直接把特殊假别的权限校验加到现有ErrorFree()校验函数里就行,所有提交前的校验逻辑放一块,后续维护也方便,不用在按钮点击事件里零散写判断。

1. 补充提交时的权限校验

在原有下拉框非空判断的后面,加一段角色和选中值的联合判断:非管理员账号选中SPECIAL LEAVE时直接返回校验失败,弹出提示阻止提交。
修改后的ErrorFree()完整代码:

Private Function ErrorFree() As Boolean
    If lblEmpNO.Text = "" Then
        DisplayMessage("error", "ERROR", "请选择员工编号!")
        Return False
        Exit Function
    End If
    If lblemployeename.Text = "" Then
        DisplayMessage("error", "ERROR", "请选择员工编号!")
        Return False
        Exit Function
    End If
    If lbldepartment.Text = "" Then
        DisplayMessage("error", "ERROR", "请选择员工编号!")
        Return False
        Exit Function
    End If
    If cmbReason.SelectedIndex = -1 Then
        DisplayMessage("error", "ERROR", "请选择请假原因!")
        Return False
        Exit Function
    End If
    ' 新增:标准用户无特殊假期申请权限校验
    If Not User.IsInRole("Admin") AndAlso cmbReason.Text = "SPECIAL LEAVE" Then
        DisplayMessage("error", "权限不足", "标准用户无法申请SPECIAL LEAVE,请联系管理员处理!")
        Return False
        Exit Function
    End If
  Return True
End Function

这里用AndAlso做短路判断,先校验角色再读取下拉框值,不会出现多余的逻辑判断;如果SPECIAL LEAVE对应的leave_code是固定值,建议把判断条件换成cmbReason.Value = "对应编码",比判断文本更稳定,后续修改选项显示文本不会导致校验失效。

2. 可选体验优化:加载下拉框时直接对普通用户隐藏受限选项

用户体验更好的做法是不用等用户选完点提交才报错,在loadcmbReason()绑定下拉数据源的时候,直接把普通用户不能选的SPECIAL LEAVE项过滤掉:

Private Sub loadcmbReason()
    Dim strLeavetype As String = "SELECT leave_type,leave_code FROM leave_types WHERE others = 'Y' AND `status` = 'Y' ORDER BY id ASC"

    Dim dt As New DataTable
    Try
        myconn.OpenConnection()
        myconn.FillDataTable(dt, strLeavetype)
        myconn.CloseConnection()

        ' 非管理员用户移除特殊假期选项
        If Not User.IsInRole("Admin") Then
            Dim targetRows = dt.Select("leave_type = 'SPECIAL LEAVE'")
            For Each row In targetRows
                dt.Rows.Remove(row)
            Next
            dt.AcceptChanges()
        End If

        cmbReason.TextField = "leave_type"
        cmbReason.ValueField = "leave_code"
        cmbReason.DataSource = dt
        cmbReason.DataBind()
    Catch ex As Exception
        myconn.CloseConnection()
    End Try
End Sub

注意:UI层的选项隐藏只是体验优化,提交环节的校验必须保留,防止用户通过本地调试修改控件值、伪造请求等方式绕过限制。

之所以不把这段判断写到btnSubmit的点击事件里,是因为现有代码已经把所有提交合法性校验都统一放在ErrorFree()里,新增的权限校验本身就属于提交合法性判断的一部分,放在统一入口维护能避免后续改逻辑时漏加判断,出现权限漏洞。

内容的提问来源于stack exchange,提问作者Una O Lian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 00:06:34