Mvc5 master detail binding
У меня есть 2 таблицы в моей базе данных SQL (компании, сектора). "Компании" - это мастер, а "секторы" - это детали. Внешний ключ присоединяется к секторам.CompanyID to Companies.Id. Существует также таблица с именем "StaticSectors", которая содержит все статические значения секторов, которые пользователь может выбрать в порядке внутреннего соединения. Например staticSector (код: 1, наименование: SectorA, ParentTreeViewID: 0) является родителем следующую строку секторе (код: 2, наименование: SectorB, ParentTreeViewID: 1)
Итак, схема таблиц такова
- Компании (Id, название, описание)
- Секторы (Id, StaticSectorID, CompanyID)
- StaticSectors (Id, TreeViewName, ParentTreeViewID)
На стороне MVC у меня есть связанные модели, контроллер [CompaniesController] и представление Create for Company.
Я создаю форму (приведенное выше представление), используя реализацию TreeView, чтобы выбрать для пользователя интернета секторы компании, которые будут регистрироваться. Проблема заключается в том, что привязка подробной таблицы (секторов) не может быть выполнена успешно. Пожалуйста, помогите!!!
Что я уже пробовал:
Модель Компании
public class Company { public Company() { StaticSectorsViewModel = new List<StaticSectorViewModel>(); } public int Id { get; set; } public string Name { get; set; } public string Description { get; set; } public IList<StaticSectorViewModel> StaticSectorsViewModel { get; set; } }
В StaticSectorViewModel
public class StaticSectorViewModel { public int Id { get; set; } public string TreeViewName{ get; set; } public int ParentTreeviewID { get; set; } public bool IsChecked { get; set; } }
Метод POST контроллера
[HttpPost] [ValidateAntiForgeryToken] // I have already try that //public ActionResult Create([Bind(Include = "Id,Name,Description,StaticSectorsViewModel")] Company company) public ActionResult Create(Company company) { // ISSUE HERE: The company.StaticSectorsViewModel IS NULL and i cannot retrieve the selected sectors in order to Save.... if (ModelState.IsValid)... {
Метод GET контроллера
[HttpGet] public ActionResult Create() { Company company = new Company(); db.StaticSectors.ToList().ForEach(listItem => company.StaticSectorsViewModel.Add(new StaticSectorViewModel{ Id = listItem.Id, TreeViewNameEN = listItem.TreeViewNameEN, TreeViewNameGR = listItem.TreeViewNameGR, ParentTreeviewID = listItem.ParentTreeviewID, IsChecked = false })); return View(company); }
Сегмент Кода Создания Представления
<div class="treeview"> @if (Model.StaticSectorsViewModel != null && Model.StaticSectorsViewModel.Count() > 0) { <ul class="list-group"> @foreach (StaticSectorViewModel currentSector in StaticSectorsViewModel.Where(current => current.ParentTreeviewID == 0).ToList()) { <li class="text-info list-group-item"> @if (currentSector.ParentTreeviewID == 0) { <span class="collapse collapsible"> </span> <span> <label><strong style="color: #0a0826">@currentSector.TreeViewNameEN</strong></label> </span> <ul> @foreach (StaticSectorViewModel currentSubSector in StaticSectorsViewModel.Where(current => current.ParentTreeviewID == currentSector.Id).ToList()) { <li class="text-info list-group-item"> <label> @Html.EditorFor(model => model.StaticSectorsViewModel.Where(x => x.Id == currentSubSector.Id).First().IsChecked, new { htmlAttributes = new { @value = currentSubSector.Id, @style = "color: #333333"} }) @currentSubSector.TreeViewName @* I try the following code without success *@ @*@Html.CheckBox(currentSubSector.Id, new { value = currentSubSector.Id, @checked = currentSubSector.IsChecked });*@ @*@Html.CheckBoxFor(model => currentSubSector.IsChecked, new { @id = currentSubSector.Id.ToString(), name = currentSubSector.Id, style = "color: #333333" })*@ </label> </li> } </ul> } </li> } </ul>
Я думаю, что проблема в том, что модель передается полная данных, но когда публикуются данные модели.StaticSectorVsViewModel потеряны. Первичные данные, такие как название компании, описание, в порядке.