2016-03-04 132 views
0

我仍然試圖讓我的頭纏繞使用ViewModels和IEnumerable/List作爲屬性。我顯然錯過了一些讓我在View中看不到IEnumberable的東西。無法在View中看到ViewModel屬性?

我最終試圖做的是顯示一個未分配給用戶組的未分配用戶列表(在這種情況下稱爲Patrols,並且PatrolId = 0)。該表格將在每個成員旁邊有一個複選框。在該表格上方將是可用巡邏的DropDownList。管理員將進入頁面查看未分配的頁面,從頂部的DDL中選擇Patrol,檢查他想分配給該Patrol的用戶,然後提交將從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> 

回答

3

當它應該是期待

@model ProjectName.ViewModels.PatrolUnassignedViewModel 

球探您控制器返回類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> 

是一個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> 
    } 

我失去了一些東西在這裏?

+0

謝謝!你和Shyju固定了我,但這個回答對我來說是最接近的答案。 IEnumberable確實有數,但我必須使用IList,因爲我循環訪問模型以分配複選框。一旦我改變了版本庫/界面,它看起來就會起作用。 – Caverman

1

從您的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> 
} 
+0

你在說什麼? 'Count'擴展方法在IEnumerable ? https://msdn.microsoft.com/library/bb338038(v=vs.100).aspx – Shyju

相關問題