我有一个MVC view,该MVC的表包含Active Directory内特定OU中所有用户的列表。我正在尝试向表中添加一列,以将您带到显示用户详细信息的“详细信息”视图(显示其他详细信息),但是我很难弄清楚如何在不使用实体框架的情况下执行此操作并传递ID对象的详细信息视图。关于如何实现此目标有任何想法吗?现在,当我单击“详细信息”操作链接时,将进入“详细信息”视图,但是没有任何数据正在传递。任何帮助将不胜感激!
public ActionResult NonComputerUsers(User model)
{
List<User> user = new List<User>();
using (var context = new PrincipalContext(ContextType.Domain, "XXX", "OU=XXX,DC=XXX,DC=com"))
{
using (var searcher = new PrincipalSearcher(new UserPrincipal(context)))
{
foreach (var result in searcher.FindAll())
{
DirectoryEntry entry = result.GetUnderlyingObject() as DirectoryEntry;
user.Add(new User()
{
FirstName = (String)entry.Properties["givenName"].Value,
LastName = (String)entry.Properties["sn"].Value,
});
}
}
}
return View(user.ToList());
}
public ActionResult Details(User model)
{
?????????
return View(model);
}
**List View**
@model ADUserManagement.Models.User
<table class="table">
<tr>
<th>
First Name
</th>
<th>
Last Name
</th>
</tr>
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.FirstName)
</td>
<td>
@Html.DisplayFor(modelItem => item.LastName)
</td>
<td>
@Html.ActionLink("Details", "Details", "Users", new { item = item.FirstName })
</td>
</tr>
}
**Details View**
@model ADUserManagement.Models.User
@{
ViewBag.Title = "Details";
}
<h2>Details</h2>
<table class="table table-bordered table-striped">
<tr>
<td>First Name</td>
<td>@Model.FirstName</td>
</tr>
<tr>
<td>Last Name</td>
<td>@Model.LastName</td>
</tr>
<tr>
<td>SAM Account Name</td>
<td>@Model.SamAccountName</td>
</tr>
答案 0 :(得分:0)
有两种方法可以做到这一点。其中一种就是您已经在做的方式。您可以将要显示在详细信息页面上的所有属性添加到User
模型中。使用该列表构建表,然后将适用的User
对象传递回您的Details
视图以显示其他详细信息。
该方法很好,因为它可以节省您为Details
视图进行第二次AD查找的时间(本质上,您的?????????
可以删除-那里不需要任何代码)。
我要说的缺点是,在您的搜索中,您要求提供的大多数帐户的详细信息要比实际使用的多,但{{1 }}无论如何,返回值已经提取了每个用户帐户的所有AD属性。如果直接使用UserPrincipal
,则可以更好地控制它。但这可能没什么大不了的,除非您在搜索中遇到性能问题。
执行此操作的另一种方法(在您当前的示例中我认为是不必要的)是存储AD中的一些唯一标识符(例如PrincipalSearcher
,DirectorySearcher
,distinguishedName
,{{ 1}},sAMAccountName
),然后将其传递回您的userPrincipalName
操作,您可以在其中再次查找该帐户,并获取“详细信息”视图所需的所有详细信息。