如何在ASP.NET MVC Razor页面展示Controller传递的ArrayList数据
将ArrayList类型AD数据渲染到Razor页面表格的实现方案
核心原则
不要直接将非泛型ArrayList传递到视图,先在Controller层转换为强类型集合再传给View,这是ASP.NET MVC传值的标准实践,能避免大量运行时类型转换错误,也能获得视图侧的智能提示支持。
步骤1:定义对应业务模型
首先新增AD用户的实体类,匹配你从Active Directory采集的字段:
// Models/AdUser.cs public class AdUser { public string LoginAccount { get; set; } public string UserDisplayName { get; set; } public string UserEmail { get; set; } public DateTime? LastLoginAt { get; set; } // 其他你从AD采集的字段按需补充 }
然后给UserLoginData.cshtml对应的页面ViewModel新增列表属性:
// Models/UserLoginDataViewModel.cs public class UserLoginDataViewModel { public List<AdUser> AdUsers { get; set; } = new List<AdUser>(); }
步骤2:修改Controller动作方法,转换ArrayList为强类型集合
在你返回视图前,把从AD拿到的原始ArrayList遍历映射为强类型List,再封装到ViewModel里传给视图:
public ActionResult UserLoginData() { // 调用你已写好的AD数据采集方法,拿到原始ArrayList ArrayList rawAdUserList = FetchUserDataFromActiveDirectory(); var pageModel = new UserLoginDataViewModel(); foreach (var rawItem in rawAdUserList) { // 按你ArrayList中存储的实际对象类型做字段映射即可 // 如果你存的是DirectoryEntry对象、Dictionary或者自定义结构,对应取值就行 var adUserItem = new AdUser { LoginAccount = rawItem.GetType().GetProperty("SamAccountName")?.GetValue(rawItem)?.ToString(), UserDisplayName = rawItem.GetType().GetProperty("DisplayName")?.GetValue(rawItem)?.ToString(), UserEmail = rawItem.GetType().GetProperty("Mail")?.GetValue(rawItem)?.ToString(), LastLoginAt = rawItem.GetType().GetProperty("LastLogon")?.GetValue(rawItem) as DateTime? }; pageModel.AdUsers.Add(adUserItem); } return View(pageModel); }
如果你坚持要直接传ArrayList到视图,只需要在视图顶部声明
@model ArrayList即可,但这种方式没有编译时检查,字段名写错只会在运行时抛错,非常不推荐。
步骤3:修改Razor视图渲染表格
在UserLoginData.cshtml顶部声明模型类型,直接遍历集合渲染表格即可:
@model UserLoginDataViewModel @{ ViewBag.Title = "AD用户登录数据"; } <h2>域用户登录数据</h2> <table class="table table-striped table-bordered"> <thead> <tr> <th>登录账号</th> <th>用户姓名</th> <th>邮箱地址</th> <th>最近登录时间</th> </tr> </thead> <tbody> @foreach (var user in Model.AdUsers) { <tr> <td>@user.LoginAccount</td> <td>@user.UserDisplayName</td> <td>@user.UserEmail</td> <td>@user.LastLoginAt?.ToString("yyyy-MM-dd HH:mm")</td> </tr> } @if (!Model.AdUsers.Any()) { <tr> <td colspan="4" class="text-center">暂无匹配的用户数据</td> </tr> } </tbody> </table>
注意事项
- 如果你的ArrayList里存的是
object[]数组或者Dictionary<string, object>结构,映射时直接按索引或者键名取值即可,不需要用反射取属性 - 所有数据转换、查询逻辑全部放在Controller里完成,视图只负责渲染展示,不要在Razor里写AD查询或者数据处理代码
- 如果遍历的时候出现类型转换报错,先在Controller遍历的位置加断点,看一下ArrayList中每一项的实际运行时类型,对应调整映射逻辑即可
- 用强类型模型的话,在视图里写
@user.的时候Visual Studio会自动提示可用字段,写错字段名编译阶段就会报错,不用等页面跑起来才发现问题
内容的提问来源于stack exchange,提问作者Chris Singleton
相关产品推荐
相关产品推荐

