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>

MVC:你如何给视图模型一个列表,并在.cshtml上正确地输出它

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 之后返回它。然后在视图中循环浏览列表。这很常见,如果你谷歌,你会发现例子。