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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 13:12:28