У меня есть EF-модель, которая содержит «ключ» и «значение». Таблица значений содержит FK для ключа. В EF-модели выглядит следующим образом:Как редактировать вложенные коллекции в MVC5?
public partial class dict_key
{
public dict_key()
{
this.dict_value = new HashSet<dict_value>();
}
public int id { get; set; }
public string name { get; set; }
...
public virtual ICollection<dict_value> dict_value { get; set; } //dict_value contains a string "value"
}
Мой контроллер передавая информацию для редактирования, как это:
// GET: Keys/Texts/5
[Authorize]
public async Task<ActionResult> Texts(int? id)
{
var key = await db.dict_key
.Include(x => x.dict_value)
.Where(x => x.id.Equals(id.Value))
.FirstOrDefaultAsync();
return View(key);
// Debugging 'key' shows that dict_value has 3 correct values.
}
Это переходит в руки мой взгляд, который показывает dict_value правильно:
@model Dict.Models.dict_key
@using (Html.BeginForm())
{
<div>Key: @Model.name </div>
<table class="table">
<tr>
<th>Language</th>
<th>Text</th>
</tr>
@for (var i = 0; i < Model.dict_value.Count(); i++)
{
<tr>
<td> @Model.dict_value.ElementAt(i).dict_lang.name_en </td>
<td> @Html.EditorFor(x => x.dict_value.ElementAt(i).value) </td>
</tr>
}
<div class="form-group">
<input type="submit" value="Save" />
</div>
</table>
}
При подаче мои изменения обратно в контроллер ...
[HttpPost]
public async Task<ActionResult> Texts(dict_key dict_key)
{
if (ModelState.IsValid)
{
//Also tried: db.Entry(dict_key).State = EntityState.Modified;
db.Entry(dict_key.dict_value).State = EntityState.Modified;
await db.SaveChangesAsync();
return RedirectToAction("Texts");
}
return View(dict_key);
}
... тогда мой «dict_key» полностью отличается от объекта, который я передал в свое редактируемое представление. Прошедший объект содержал коллекцию dict_value, а «возвращенный» и отредактированный объект возвращался с соответствующим ключевым объектом, но с пустой коллекцией dict_value.
Я стараюсь не использовать пользовательскую модель или сумку просмотра, чтобы делать все это вручную. Каково наилучшее решение для этого?