Задача.
Есть база данных - две таблицы Обращения и Ответственные, связь многие ко многим.
Надо в окно редактирования Обращений вывести данные из Ответственных в виде checkbox так, чтобы те которые уже под это обращение выбраны были помещены галочкой, а остальные данные из таблицы Ответственные были доступны для отметки. После редактирования (снятия или добавления отметки) данные сохранялись в базу (Третья таблица ОбращенияОтветственные).
Проблема: Я совершенно не знакома с Bootstrap (а я так понимаю что пользоваться надо ним) и не знаю как все это реализовать. Попробовала сделать но в результате в виде checkbox выводятся только выбранные данные, а остальные просто списком и после нажатия Сохранить. Данные не то что не меняются, а полностью удаляются.
Подскажите как сделать правильно.
Ой, и сразу еще спрошу - поле дата не выводит данные из базы вместо этого стоит шаблон. Как это исправить?
Спасибо.
Модель:
public class Appeal
{
public int AppealId { get; set; }
[Display(Name = "Номер")]
public string Num { get; set; }
[Display(Name = "Дата звернення")]
[DataType(DataType.Date)]
public DateTime Data { get; set; }
[Display(Name = "ПІБ")]
public string NameAp { get; set; }
[Display(Name = "Адреса")]
public string Address { get; set; }
[Display(Name = "Питання")]
public string Question { get; set; }
public virtual ICollection<Responsible> Responsibles { get; set; }
public Appeal()
{
Responsibles = new List<Responsible>();
}
}
Контроллер:
public ActionResult Edit(int id = 0)
{
Appeal appeal = db.Appeals.Find(id);
if (appeal == null)
{
return HttpNotFound();
}
ViewBag.Responsibles = db.Responsibles.ToList();
return View(appeal);
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(Appeal appeal, int[] selectedResponsibles)
{
Appeal newAppeal = db.Appeals.Find(appeal.AppealId);
newAppeal.Num = appeal.Num;
newAppeal.Data = appeal.Data;
newAppeal.NameAp = appeal.NameAp;
newAppeal.Address = appeal.Address;
newAppeal.Question = appeal.Question;
newAppeal.Responsibles.Clear();
if (selectedResponsibles != null)
{
foreach (var r in db.Responsibles.Where(ro => selectedResponsibles.Contains(ro.ResponsibleId)))
{
newAppeal.Responsibles.Add(r);
}
}
db.Entry(newAppeal).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
представление Edit.cshtml(здесь и не получается):
<div class="form-group">
@Html.LabelFor(model => model.Data, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Data, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Data, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Question, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-xl-12">
@Html.EditorFor(model => model.Question, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Question, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<label class="control-label col-md-2">Відповідальні</label>
@foreach (Responsible r in ViewBag.Responsibles)
{
<div class="form-check">
<input class="form-check-input" type="checkbox" name="selectedCourses" value="@r.ResponsibleId"
@(Model.Responsibles.Contains(r) ? "checked=\"checked\"" : "") />@r.Name <br />
</div>
}
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Зберегти" class="btn btn-default" />
</div>
</div>
</div>