У меня возникли проблемы с привязкой данных к коллекции элементов коллекции (у меня также возникла проблема с правильной формулировкой моей проблемы). Давайте просто упростим все, используя пример с psudo-моделями.MVC Добавить и удалить элементы из подмножества
Допустим, у меня есть следующие примеры моделей:
public class Month()
{
public int ID { get; set; }
public string Name { get; set; }
public virtual ICollection<Week> Weeks { get; set; }
}
public class Week()
{
public int ID { get; set; }
public int MonthID { get; set; }
public String Name { get; set; }
public virtual ICollection<Day> Days { get; set; }
}
public class Day()
{
public int ID { get; set; }
public String Name { get; set; }
}
... и пример ViewModel:
public class EditMonthViewModel()
{
public Month Month { get; set; }
public List<Week> Weeks { get; set; }
public List<Day> AllDays { get; set; }
}
Цель Edit Action/View является, чтобы позволить пользователям редактировать месяц, недели, назначенные на месяц, и добавьте и удалите дни с недель определенного месяца. Представление может помочь.
@model myProject.ViewModels.EditMonthViewModel
//...
@using (Html.BeginForm())
{
//Edit Month Stuff...
@for(int i = 0; i < Model.Weeks.Count(); i++)
{
<h2>@Model.Weeks[i].Name</h2>
@Html.EditorFor(model => Model.Weeks[i].Name)
//loop through all possible days
//Select only days that are assigned to Week[i]
@for(int d = 0; d < Model.AllDays.Count(); d ++)
{
//This is the focus of this question.
//How do you bind the data here?
<input type="checkbox"
name="I have no idea"
@Html.Raw(Model.Weeks[i].Days.Contains(Model.AllDays[d]) ? "checked" : "") />
}
}
}
методы контроллера Действие
public ActionResult Edit(int id)
{
var viewModel = new EditMonthViewModel();
viewModel.Month = db.Months.Find(id);
viewModel.Weeks = db.Weeks.Where(w => w.MonthID == id).ToList();
viewModel.AllDays = db.Days.ToList();
}
[HttpPost]
public ActionResult Edit(EditMonthViewModel viewModel)
{
var monthToUpdate = db.Months.Find(viewModel.Month.ID);
//...
if(viewModel.Weeks != null)
{
foreach (var week in viewModel.Weeks)
{
var weekToUpdate = monthToUpdate.Weeks.Single(w => w.ID == week.ID);
//...
/*So, I have a collection of weeks that I can grab,
but how do I know what was selected? My viewModel only has a
list of AllDays, not the days selected for Week[i]
*/
}
}
Как я могу гарантировать, что, когда я представить форму выбранные дни будут связываться недели?
Какие проблемы/ошибки вы испытываете? Можем ли мы увидеть действие вашего контроллера, которое обрабатывает это сообщение формы? –
Мне также будет интересно увидеть действие контроллера, которое заполняет вашу ViewModel. Интересно, что ваш класс Month уже имеет ссылку на Weeks и косвенную ссылку на Days (через Weeks), но вы добавили их в качестве дополнительных полей в ViewModel. Зачем? –
Я добавил несколько методов действия psudo. Я новичок в MVC, и я придерживаюсь философии, согласно которой представление не должно запускать запросы (отправьте представление все, что нужно, в viewmodel). Если вы не думаете, что это необходимо, я могу, конечно, переключить ситуацию. Моя основная проблема (с которой я столкнулась с проблемой), заключается в том, что я не знаю, что должно быть для свойства «имя» флажка, чтобы привязка к объекту привязывала день. Я добавлю еще один небольшой параграф, объясняющий ситуацию лучше. – jbaum012