2016-03-01 4 views
1

Не уверен, почему я проголосовал, но я собираюсь переписать свой вопрос после проведения некоторых исследований и тестирования. Это побочный проект, который я использую для изучения MVC/EF/Repository/Bootstrap и т. Д. Я получаю пару часов здесь несколько ночей в неделю, чтобы работать над ним.Должен ли я использовать ViewBag для передачи списка в представление?

Basic оригинальный вопрос:

Я знаю, что я должен действительно быть с помощью списка <> в ViewModel, чтобы передать данные в View, но я не знаю, как или, если он будет соответствовать моим требованиям.

То, что я пытаюсь сделать, - это получить список пользователей для отображения в таблице, которая будет иметь флажок в каждой строке. Над этой таблицей я хочу иметь список групп, к которым они могут быть назначены. Вы выбираете раздел из DropDownList (DDL), а затем проверяете, кому вы хотите его назначить. Это группы/разделы, которые я хочу, хочу назначить в качестве списка и перейти к представлению.

Итак, у меня есть ViewModel со списком, и я использую репозиторий для заполнения виртуальной машины. То, что я не знаю, как это сделать, - это когда/когда заполнять этот список с каждым объектом VM, и даже если я это сделаю, и есть 50 пользователей, я бы не хотел делать 50 поездок в БД, чтобы вытащить ту же информацию . Вот почему я думаю, что для этого сценария с помощью ViewBag передать этот список групп в представление может быть оправданным. С другой стороны, я хотел бы узнать, как правильно заполнить этот список в виртуальной машине для будущей кодировки.

Обновленный вопрос/код:

Таким образом, после дополнительных исследований и следующих несколько предложений, которые я теперь получил следующий код. Я все еще не уверен, как правильно заполню свои патрули в своей модели ViewModel, чтобы заполнить DDL в моем представлении.

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

Свойство Patrols в PatrolMemberViewModel должно быть списком около 5 записей, которые я бы вытащил из таблицы БД вместо жесткого кодирования в DDL.

ViewModel:

public class PatrolViewModel 
    { 
     public int PatrolId { get; set; } 
     public string PatrolName { get; set; } 
    } 

    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 PatrolViewModel Patrols { get; set; } 

    } 

Контроллер:

public ViewResult Unassigned() 
     { 
      try 
      { 
       IEnumerable<PatrolMemberViewModel> model = repository.SelectAllUnassigned(); 
       return View(model); 
      } 
      catch (Exception) 
      { 
       ModelState.AddModelError(string.Empty, "Error retrieving the record."); 
       return View(); 
      } 
     } 

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

Вид:

@model IList<ProjectName.ViewModels.PatrolMemberViewModel> 

@{ 
    ViewBag.Title = "Unassigned"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

<h2>Patrols</h2> 


@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" class="btn btn-success" /> 
    </div> 
} 
<p>&nbsp;</p> 
+2

Выполнение 50 вызовов в db не имеет ничего общего с решениями ViewBag и ViewModel. Речь идет о том, как вы запрашиваете.http: //stackoverflow.com/questions/33921262/is-deferred-execution-in-asp-net-mvc-view-a-very-bad-thing/33921573#33921573 – Shyju

+0

@Shyju ... можете ли вы взглянуть на мое обновление, которое я опубликовал в своем вопросе, и посмотреть, что вы можете сказать, что я делаю неправильно? Спасибо ... – Caverman

+0

Его немного сложно сопоставить ваш _list of users_ и _list из Groups_ с кодом, который вы показали (как это связано с 'MemberSectionViewModel' и' Sections' и 'PatrolViewModel' и' MemberPatrolViewModel')? –

ответ

1

Начните с создания моделей представления, чтобы представлять, что вы хотите отображать/редактировать в представлении.Ваш PatrolMemberViewModel можно использовать, но удалить атрибут [Key] и int PatrolId и PatrolViewModel Patrols.

Затем создать модель родительского вида

public class AssignPatrolViewModel 
{ 
    [Display(Name = "Patrol")] 
    [Required(ErrorMessage = "Please select a patrol")] 
    public int? SelectedPatrol { get; set; } 
    public IEnumerable<SelectListItem> PatrolList { get; set; } 
    public List<PatrolMemberViewModel> Members { get; set; } 
} 

и вы получите метод будет

public ViewResult Unassigned() 
{ 
    var model = new AssignPatrolViewModel 
    { 
     PatrolList = new SelectList(db.Patrols, "PatrolId", "PatrolName"), // modify to suit 
     Members = repository.SelectAllUnassigned().ToList() 
    }; 
    return View(model); 
} 

и в представлении

@model AssignPatrolViewModel 
.... 
@using (Html.BeginForm()) 
{ 
    @Html.LabelFor(m => m.SelectedPatrol) 
    @Html.DropDownListFor(m => m.SelectedPatrol, Model.PatrolList, "Please select") 
    @Html.ValidationMessageFor(m => m.SelectedPatrol) 
    <table> 
     .... // thead elements 
     <tbody> 
      @for(int i = 0; i < Model.Members.Count; i++) 
      { 
       <tr> 
        <td> 
         @Html.CheckBoxFor(m => m.Members[i].IsSelected) 
         @Html.HiddenFor(m => m.Members[i].MemberId) 
         // add other hidden inputs for properties you want to post 
        </td> 
        <td>@Html.DisplayFor(m => m.Members[i].FirstName)</td> 
        .... 
       </tr> 
      } 
     </tbody> 
    </table> 
    <input type="submit" value="Assign" class="btn btn-success" /> 
} 

Затем в методе POST

[HttpPost] 
public ViewResult Unassigned(AssignPatrolViewModel model) 
{ 
    if (!ModelState.IsValid) 
    { 
     model.PatrolList = new SelectList(db.Patrols, "PatrolId", "PatrolName"); 
     return View(model); 
    } 
    // Get selected ID's 
    IEnumerable<int> selected = model.Members.Where(m => m.IsSelected).Select(m => m.MemberId); 
    // Get matching data models 
    var members = db.Person.Where(p => selected.Contains(p.PID)); // modify to suit 
    // loop each each member, update its PatrolId to the value of model.SelectedPatrol 
    // save and redirect 
} 
+0

Большие СПАСИБО за то, что нашли время, чтобы написать это. Я работаю над этим и продолжаю в течение последних нескольких дней и приближаюсь к тому, что у вас есть, но это вызывающе помогло заполнить пробелы и заставить его работать.Я еще не выполнил POST, но это будет следующим, и я буду использовать ваш пример. – Caverman

+0

У меня было немного времени, чтобы начать работу над частью POST этого. Используя ваш образец, я смог получить выбранные элементы и их объекты, но я не понимаю, как получить выбранный PatrolId из выпадающего списка. Я попытаюсь найти эту пьесу и посмотреть, что я могу придумать. – Caverman

+0

Выбранное значение 'PatrolID' находится в' model.SelectedPatrol' (см. Комментарии в конце последнего фрагмента кода. Например, вы можете использовать 'foreach (член var в членах) {member.PatrolID = model.SelectedPatrol;. ....}; ' –

0

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

Но я думаю, что ваше использование ViewBag для передачи списка разделов вполне допустимо. Я делаю это все время для DDL, как это.

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