无法在视图中看到视图模型属性

本文关键字:视图 模型 属性 | 更新日期: 2023-09-27 18:37:20

我仍然试图使用ViewModels和IEnumerable/List作为属性来思考。我显然错过了一些不允许我在我的观点中看到我的 IEnumerable 的东西。

我最终要做的是有一个视图,该视图将显示未分配到组的未分配用户列表(在本例中称为巡逻,PatrolId=0)。该表的每个成员旁边都有一个复选框。该表上方将是可用巡逻的下拉列表。管理员将来到页面以查看未分配的那些,从顶部的 DDL 中选择一个巡逻,检查他想要分配给该巡逻的用户,然后提交将从 DDL 传递 PatrolID 的表单并找到所有选定的成员,以便使用该 PatrolID 更新他们的记录。

在下面的视图中,当我遍历 Scout 属性时,我假设我能够在此部分中使用 Model.Scout,以便循环遍历并写出该 IEnumerable 中的所有成员。

@for (var i = 0; i < Model.Count(); i++)

但是,当我尝试在使用模型时使用智能感知来查看 Scout 属性时,我看不到该属性。除此之外,我认为在写出所有行之前,我需要首先检查 Scout 属性以查看是否有计数。同样,我看不到 Scout 属性以检查其计数。

视图模型

public class PatrolMemberViewModel
{
        [Key]
        public int MemberId { get; set; }
        public int PatrolId { get; set; }
        [Display(Name = "First Name")]
        public string FirstName { get; set; }
        [Display(Name = "Last Name")]
        public string LastName { get; set; }
        [Display(Name = "Phone")]
        public string PhonePrimary { get; set; }
        [Display(Name = "Email")]
        public string EmailPrimary { get; set; }
        public bool IsSelected { get; set; }
}
public class PatrolUnassignedViewModel
{
        public SelectList Patrols { get; set; }
        public IEnumerable<PatrolMemberViewModel> Scout { get; set; }
}

控制器

// GET: 
public ViewResult Unassigned()
{
    PatrolUnassignedViewModel unassinged = new PatrolUnassignedViewModel();
    unassinged.Patrols = new SelectList(repository.SelectAllPatrols());
    unassinged.Scout = repository.SelectAllUnassigned();
            
    return View(unassinged);
}

存储 库

public IEnumerable<PatrolMemberViewModel> SelectAllUnassigned()
{
            using (DataContext db = new DataContext())
            {
                var results = (from p in db.Person
                               where p.IsActive == true
                               && p.IsScout == true
                               && p.PatrolId == 0
                               select new PatrolMemberViewModel
                               {
                                   MemberId = p.PID,
                                   FirstName = p.FirstName ?? string.Empty,
                                   LastName = p.LastName ?? string.Empty,
                                   EmailPrimary = p.EmailPrimary ?? string.Empty,
                                   PhonePrimary = p.PhonePrimary ?? string.Empty,
                                   PatrolId = p.PatrolId,
                                   IsSelected = false
                               }
                                ).OrderBy(o => o.LastName).ThenBy(o => o.FirstName).ToList();
                return results;
            }
}
public IEnumerable<PatrolName> SelectAllPatrols()
{
    return db.PatrolNames;
}

视图

@model IList<ProjectName.ViewModels.PatrolUnassignedViewModel>
@{
    ViewBag.Title = "Unassigned";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>Patrols</h2>
<h4>Assign Scouts to a Patrol.</h4>

@using (Html.BeginForm("Update", "Patrol", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(false, "", new { @class = "alert alert-danger" })
    <table class="table table-bordered table-striped table-hover table-condensed tbackground">
        <tr>
            <th class="text-center">
            </th>
            <th class="text-center">
                First Name
            </th>
            <th class="text-center">
                Last Name
            </th>
            <th class="text-center">
                Email
            </th>
            <th class="text-center">
                Phone
            </th>
        </tr>
    
        @for (var i = 0; i < Model.Count(); i++)
        {
        <tr>
            <td class="text-center">
                @Html.CheckBoxFor(m => m[i].IsSelected)
            </td>
            <td>
                @Html.DisplayFor(m => m[i].FirstName)
            </td>
            <td>
                @Html.DisplayFor(m => m[i].LastName)
            </td>
            <td>
                <a href="mailto:@Model[i].EmailPrimary">@Model[i].EmailPrimary</a>
            </td>
            <td class="text-center">
                @Html.DisplayFor(m => m[i].PhonePrimary)
            </td>
        </tr>
        }
    </table>
    
    <div class="control-wrapper">
        <input type="submit" id="btnSubmit" value="Assign Scouts" class="btn btn-success" />
    </div>
}
<p>&nbsp;</p>

无法在视图中看到视图模型属性

控制器正在返回类的单个实例 PatrolUnassignedViewModel

    public ViewResult Unassigned()
    {
        PatrolUnassignedViewModel unassinged = new PatrolUnassignedViewModel();
        unassinged.Patrols = new SelectList(repository.SelectAllPatrols());
        unassinged.Scout = repository.SelectAllUnassigned();
        return View(unassinged);
    }

您的观点期待 IList

@model IList<ProjectName.ViewModels.PatrolUnassignedViewModel>

什么时候应该期待

@model ProjectName.ViewModels.PatrolUnassignedViewModel

您的侦察员是IEnumerable,因此没有计数方法,因此应该是

public IList<PatrolMemberViewModel> Scout { get; set; }
public IList<PatrolMemberViewModel> SelectAllUnassigned()
{
}

你应该像这样做你的循环

    @for (var i = 0; i < Model.Scout.Count(); i++)
    {
    <tr>
        <td class="text-center">
            @Html.CheckBoxFor(m => m.Scout[i].IsSelected)
        </td>
        <td>
            @Html.DisplayFor(m => m.Scout[i].FirstName)
        </td>
        <td>
            @Html.DisplayFor(m => m.Scout[i].LastName)
        </td>
        <td>
            <a href="mailto:@Model.Scout[i].EmailPrimary">@Model.Scout[i].EmailPrimary</a>
        </td>
        <td class="text-center">
            @Html.DisplayFor(m => m.Scout[i].PhonePrimary)
        </td>
    </tr>
    }

我在这里错过了什么吗?

从您的 GET 操作方法中,您正在传递一个 PatrolUnassignedViewModel 的对象。但是您的观点绑定到PatrolUnassignedViewModel集合。所以把你的视图改成像

@model PatrolUnassignedViewModel

现在,您可以使用 Model.Scout 属性,该属性是一个集合。

@model PatrolUnassignedViewModel
<h2>Total : @Model.Scout.Count()</h2>
@foreach(var item in Model.Scout)
{
   <label>@item.FirstName</label>
}