2016-03-04 3 views
0

Я все еще пытаюсь обернуть свою голову, используя ViewModels и IEnumerable/List as properties. Мне явно не хватает чего-то, что не позволяет мне увидеть мой IEnumberable в моем представлении.Невозможно увидеть свойство ViewModel в представлении?

То, что я в конечном счете пытаюсь сделать, - это показать, что будет отображаться список неназначенных пользователей, не назначенных группе (в данном случае это называется Patrols и будет иметь PatrolId = 0). В таблице будет установлен флажок рядом с каждым членом. Над этой таблицей будет DropDownList доступных патрулей. Администратор придет на страницу, чтобы увидеть те, которые не назначены, выберите Патруль из DDL наверху, проверьте пользователей, которых он хочет назначить этому Патрулю, и затем отправьте форму, которая передаст PatrolID из DDL и найдите всех выбранных членов, чтобы обновить их запись с помощью PatrolId.

В представлении ниже, когда я перехожу через свойство Scout, я бы предположил, что смогу использовать Model.Scout в этой части, чтобы пропустить и выписать все элементы в этом IEnumerable.

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

Однако, когда я пытаюсь использовать IntelliSense, чтобы увидеть свойство Scout при использовании модели, я не вижу свойство. В дополнение к этому, я думаю, мне нужно будет сначала проверить свойство Scout, чтобы увидеть, есть ли счет, прежде чем я выпишу все строки. Опять же, я не вижу свойства Scout, чтобы проверить его количество.

ViewModel

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); 
    } 

Repository

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

You контроллер возвращает один экземпляр класса 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> 
    } 

Я пропускаю что-то здесь?

+0

Спасибо! Ты и Шыю меня подкрепили, но этот ответ был самым близким для меня ответом. 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

Смежные вопросы