MVC:你如何给视图模型一个列表,并在.cshtml上正确地输出它
本文关键字:并在 列表 一个 cshtml 输出 正确地 视图 模型 MVC | 更新日期: 2023-09-27 18:35:19
我所做的是搜索Activedirectory用户,给定的值是名称。然后,我创建一个包含值名称,电子邮件和描述的视图模型。然后,我在索引上将其显示为 .cshtml。
问题是我制作它的方式,它只通过它找到的第一个用户发送 - (如果我从多个 Andrew 中搜索 Andrew,它会找到所有用户,但返回第一个。
我想将它们添加到列表中,然后几乎做同样的事情,但当然在 .cshtml 上迭代列表并显示结果。
这是HomeController.cs代码 -
public ActionResult Index(IndexViewModel profile)
{
if (ModelState.IsValid)
{
//List<Principal> users = new List<Principal>();
using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain))
{
UserPrincipal qbeUser = new UserPrincipal(ctx);
qbeUser.DisplayName = profile.Name + "*";
using (PrincipalSearcher srch = new PrincipalSearcher(qbeUser))
{
if(!(srch.FindAll().Count() < 0))
{
foreach(var found in srch.FindAll())
{
//users.Add(found);
IndexViewModel returnmodel = new IndexViewModel(found);
return View(returnmodel);
}
}
}
}
}
return View(profile);
}
其中要看的一点是
foreach(var found in srch.FindAll())
{
//users.Add(found);
IndexViewModel returnmodel = new IndexViewModel(found);
return View(returnmodel);
}
下面是 IndexViewModel 的代码.cs#
public class IndexViewModel
{
public IndexViewModel(Principal found)
{
Name = found.DisplayName;
Email = found.UserPrincipalName;
Description = found.Description;
}
[Required(ErrorMessage = "Please enter a name")]
[Display(Name = "Persons Name")]
public string Name { get; set; }
public string Email { get; set; }
public string Description { get; set; }
}
这是Index.cshtml
/这只是创建输入框、验证文本和提交按钮。
<div id="content">
@Html.ValidationSummary(true)
@using (Html.BeginForm("Index", "Home"))
{
<fieldset>
<div class="form-group col-md-12">
@Html.LabelFor(model => model.Name, new { @class = "control-label col-md-2" })
<div class="col-md-4">
@Html.EditorFor(modelItem => Model.Name, new { htmlAttributes = new { @class = "form-control", @style = "width:280px" }, })
@Html.ValidationMessageFor(x => x.Name)
</div>
<div class="col-md-2">
<input type="submit" class="btn btn-default" value="Search">
</div>
<div class="col-md-3">
</div>
</div>
</fieldset>
}
<br>
</div>
这里显示找到的单个结果/
<table id="historyTable" class="table">
<thead>
<tr>
<th>Name</th>
<th>Email</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>@Model.Name</td>
<td>@Model.Email</td>
<td>@Model.Description</td>
</tr>
</tbody>
</table>
Andy 的答案是正确的,但如果您仍然遇到问题,您可能想尝试以下代码。
首先创建新的用户类以保存有关要显示的用户的信息:
public class User
{
public string Name { get; set; }
public string Email { get; set; }
public string Description { get; set; }
}
然后修改您的IndexViewModel
以使用这个新类:
public class IndexViewModel
{
public List<User> FoundUsers {get; set;}
public string Name {get; set;}
public IndexViewModel(List<User> found)
{
this.FoundUsers = found;
}
}
在您的控制器中,您正确地确定了问题区域,这将是解决它的一种方式:
public ActionResult Index(IndexViewModel profile)
{
if (ModelState.IsValid)
{
List<User> users = new List<User>();
using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain))
{
UserPrincipal qbeUser = new UserPrincipal(ctx);
qbeUser.DisplayName = profile.Name + "*";
using (PrincipalSearcher srch = new PrincipalSearcher(qbeUser))
{
if(!(srch.FindAll().Count() < 0))
{
foreach(var found in srch.FindAll())
{
users.Add(new User() {
Name = found.Name,
Email = found.Email,
Description = found.Description
});
}
}
IndexViewModel returnmodel = new IndexViewModel(users);
return View(returnmodel);
}
}
}
return View(profile);
}
因此,在控制器中,您现在使用可以在视图中迭代的List<User>
填充视图模型:
<table id="historyTable" class="table">
<thead>
<tr>
<th>Name</th>
<th>Email</th>
<th>Description</th>
</tr>
</thead>
<tbody>
@foreach(var user in Model.FoundUsers)
{
<tr>
<td>@user.Name</td>
<td>@user.Email</td>
<td>@user.Description</td>
</tr>
}
</tbody>
</table>
我认为您首先想要一个用户模型。然后让你的索引视图模型有一个List<User>
。在您的 foreach 中,创建一个新的 User 类并将其添加到您的列表中。在 foreach 外部创建 IndexViewModel,并在 foreach 之后返回它。然后在视图中循环浏览列表。这很常见,如果你谷歌,你会发现例子。