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
关键说明
- 参数化查询:必须用
@参数名传递用户输入,绝对不能直接拼接字符串,否则恶意用户可通过构造特殊用户名窃取或破坏数据库数据。 - 单条数据处理:员工ID是唯一标识,查询结果仅一条,用
If reader.Read()代替While循环更合理。 - 字段索引优化:用
reader.GetOrdinal("字段名")代替硬编码索引(如GetString(1)),避免数据库字段顺序调整后代码出错。
内容的提问来源于stack exchange,提问作者jared alcala
相关产品推荐
相关产品推荐

