2014-03-24 3 views
0

Что я пытаюсь сделать, так это то, что сначала мне нужно отобразить список членов, которые мне нужно добавить в группу. Затем пользователь будет выбирать каждый флажок для каждой строки членов, которые пользователь выбирает. Мой код уже запущен. Проблема в том, что когда я применил jquery.dataTable (который тоже отлично отображает), он не возвращает все необходимые данные, когда некоторые из членов скрыты (через следующую страницу или поиск). Все работает нормально, когда я нажимаю show 100, таким образом отображая все скрытые данные, dataTable.MVC 4 и dataTables: checkbox entry возвращает null ViewModel

мой ViewModel

public class ChooseMembersEditorViewModel 
{ 
    public bool Selected { get; set; } 
    public string Id { get; set; } 
    public string Name { get; set; } 
    public string Sex { get; set; } 
    public string Age { get; set; } 

    public ChooseMembersEditorViewModel() 
    { 
     this.Selected = false; 
     this.Id = ""; 
    } 
} 

, которая находится внутри другой ViewModel

public class AddMemberViewModel 
{ 
    public List<Group> Group{ get; set; } 
    public List<ChooseMembersEditorViewModel> LGMembers { get; set; } 

    public AddLifegroupMemberViewModel() 
    { 
     this.Group= new List<Group>(); 
     this.LGMembers = new List<ChooseMembersEditorViewModel>(); 
    } 

    public IEnumerable<string> getSelectedIds() 
    { 
     var getSelected = (from members in this.LGMembers 
          where members.Selected 
          select members.Id); //returns error here saying value cannot be null 
     System.Diagnostics.Debug.WriteLine(string.Format("Count {0}", getSelected.Count())); 
     return getSelected; 
    } 
} 

Screenshot

Когда я проверяю 1 значений и нажмите Добавить член, я получаю значение не должно быть пустым изнутри getSelectedIds Linq

Благодарим вас за помощь се!

EDIT

Это, как я список всех пользователей. Участники SubmitSelectedMembers в основном получают все члены, чей идентификатор проверен и добавляет их в базу данных.

[Authorize(Roles = "Admin")] 
    public ActionResult AddLifegroupMembers(int id) 
    { 
     var model = new AddLifegroupMemberViewModel(); 

     Lifegroup lifegroup = db.Lifegroup.Find(id); 

     int leaderAge = GetAge(lifegroup.LGLeader.User.Birthday); 
     ViewBag.Age = leaderAge; 

     System.Diagnostics.Debug.WriteLine(string.Format("{0}", lifegroup.LGName.ToString())); 

     var nonMembers = from u in db.Users 
         where !(from lgm in db.LGMember 
           select lgm.UserID).Contains(u.Id) //should not be part of any Lifegroup 
           && 
           !(from l in db.Lifegroup 
           where l.LifegroupID.Equals(id) 
           select l.LGLeader.UserID).Contains(u.Id) //should not include leader of said group 
         select u; 

     System.Diagnostics.Debug.WriteLine(string.Format("Number of LG: {0}", model.Lifegroup.Count())); 

     foreach (var user in nonMembers) 
     { 
      int age = GetAge(user.Birthday); 

      var editorViewModel = new ChooseMembersEditorViewModel() 
      { 
       Id = user.Id, 
       Name = string.Format("{0} {1}", user.FirstName, user.LastName), 
       Selected = false, 
       Age = age.ToString(), 
       Sex = user.Sex 
      }; 

      model.LGMembers.Add(editorViewModel); 
     } 
     model.Lifegroup.Add(lifegroup); 

     return View(model); 
    } 

    public ActionResult SubmitSelectedMembers(AddLifegroupMemberViewModel model) 
    { 
     var getSelected = (from members in model.LGMembers 
          where members.Selected 
          select members.Id); 

     List<string> _selected = new List<string>(); 
     foreach (var selected in getSelected) 
     { 
      _selected.Add(selected); 
     } 

     //var selectedIds = model.getSelectedIds(); 
     var lifegroupID = model.Lifegroup[0].LifegroupID; 

     //System.Diagnostics.Debug.WriteLine(string.Format("Lifegroup ID: {0}", model.Lifegroup.LifegroupID)); 

     var selectedUsers = from u in db.Users 
          //where selectedIds.Contains(u.Id 
          where _selected.Contains(u.Id) 
          select u; 

     foreach (var users in selectedUsers) 
     { 
      var idManager = new IdentityManager(); 
      idManager.AddUserToRole(users.Id, "LifegroupMember"); 

      var lgmember = new LGMember() 
      { 
       LifegroupID = lifegroupID, 
       UserID = users.Id, 
       DateJoined = DateTime.Now 
      }; 

      /* 
      * Insert Code to insert part of Lifegroup to GrowthMileStone     
      */ 

      db.LGMember.Add(lgmember); 
     } 
     db.SaveChanges(); 

     return RedirectToAction("ViewLifegroups"); 
    } 

ответ

0

Вам необходимо создать экземпляр объектов, прежде чем вставлять их в список LGMembers. Этого не происходит в коде выше.

+0

Привет @badaBoom, я не совсем уверен, что вы имеете в виду инициализации объекта. Я уже могу отправить и вызвать объекты должным образом. Единственная проблема заключается в том, что dataTable, похоже, скрывает элементы при поиске или поворачивает предыдущее выполнение страницы. Таким образом, некоторые значения указывают, что они равны нулю. – Dominic

+0

Как вы вставляете объекты в LGMembers? Как выглядит код? Можете ли вы поделиться им также? Являются ли объекты в списке экземплярами LGMembers? Убедитесь, что объекты типа ChooseMembersEditorViewModel созданы. – SamekaTV

+0

@ Dominic вы это проверили? Не забудьте ответить. – SamekaTV

0

Причина использования флажка null ViewModel заключается в том, что фильтрация или подкачка разрезают вашу привязку View to ViewModel. Поскольку привязка не может видеть элемент, который не отображается во время публикации. Хотя это не очень хорошее решение, если кто-то хочет решить проблему таким образом, решение этой проблемы может быть удалено с фильтрацией или подкачкой перед отправкой. Пример раствора помещают в виде представить

table.search('').columns().search('').draw() 

или

table.fnFilter(""); 
var oSettings = table.fnSettings(); 
table._iDisplayLength = -1; 
table.fnDraw(); 
Смежные вопросы