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

ASP.NET MVC控制器数据视图展示异常问题求助

问题排查与解决

核心问题

你把整个List(Of IntranetSecurity)集合赋值给了ViewData("Nombres"),视图直接输出时默认调用集合的ToString()方法,所以会显示集合的类型名称System.Collections.Generic.List1[app.IntranetSecurity],而非你需要的员工姓名。

另外你的代码还存在两个关键问题:

  • 按员工ID查询应为单条结果,没必要用List存储,徒增后续处理复杂度
  • 直接拼接SQL字符串存在严重的SQL注入风险,必须改用参数化查询

修正后的控制器代码

Function Index() As ActionResult
    Dim MyConnectionString As String = System.Configuration.ConfigurationManager.ConnectionStrings("PAMIntranet_DevConnectionString").ConnectionString
    Dim userInfo As IntranetSecurity = Nothing
    Dim UserN As String = Session("UserN")

    Using cnn As New System.Data.SqlClient.SqlConnection(MyConnectionString)
        ' 参数化查询避免SQL注入
        Dim qry As String = "SELECT IDEmployee, EmployeeName, Avatar FROM IntranetSecurity WHERE IDEmployee = @UserN"
        Using cmd As New System.Data.SqlClient.SqlCommand(qry, cnn)
            cmd.Parameters.AddWithValue("@UserN", UserN)
            cnn.Open()
            
            Using reader As SqlDataReader = cmd.ExecuteReader()
                ' 员工ID唯一,仅取第一条结果
                If reader.Read() Then
                    userInfo = New IntranetSecurity()
                    ' 通过字段名获取索引,避免字段顺序变动导致错误
                    userInfo.EmployeeName = reader.GetString(reader.GetOrdinal("EmployeeName"))
                    ' 处理头像字段(根据实际字段类型调整)
                    If Not reader.IsDBNull(reader.GetOrdinal("Avatar")) Then
                        userInfo.Avatar = reader.GetString(reader.GetOrdinal("Avatar"))
                    End If
                End If
            End Using
        End Using
    End Using

    ' 传递单个用户对象到视图
    ViewData("UserInfo") = userInfo
    ' 也可单独传递字段
    ' ViewBag.EmployeeName = userInfo?.EmployeeName
    ' ViewBag.Avatar = userInfo?.Avatar

    Return View()
End Function

修正后的视图代码

如果传递的是用户对象:

@If ViewData("UserInfo") IsNot Nothing Then
    Dim user = CType(ViewData("UserInfo"), app.IntranetSecurity)
    <h2>@user.EmployeeName</h2>
    ' 显示头像(假设Avatar是图片路径)
    If Not String.IsNullOrEmpty(user.Avatar) Then
        <img src="@user.Avatar" alt="@user.EmployeeName" />
    End If
End If

如果单独传递字段:

<h2>@ViewBag.EmployeeName</h2>
@If Not String.IsNullOrEmpty(ViewBag.Avatar) Then
    <img src="@ViewBag.Avatar" alt="@ViewBag.EmployeeName" />
End If

关键说明

  1. 参数化查询:必须用@参数名传递用户输入,绝对不能直接拼接字符串,否则恶意用户可通过构造特殊用户名窃取或破坏数据库数据。
  2. 单条数据处理:员工ID是唯一标识,查询结果仅一条,用If reader.Read()代替While循环更合理。
  3. 字段索引优化:用reader.GetOrdinal("字段名")代替硬编码索引(如GetString(1)),避免数据库字段顺序调整后代码出错。

内容的提问来源于stack exchange,提问作者jared alcala

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 03:13:01