2015-07-17 4 views
0

У меня есть 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.

Я стараюсь не использовать пользовательскую модель или сумку просмотра, чтобы делать все это вручную. Каково наилучшее решение для этого?

ответ

1

Collection.ElementAt не генерирует правильное имя поля в Razor. Вам нужен List. Здесь вы должны использовать модель представления вместо своей сущности напрямую и просто сделать свою dict_value коллекцию List<dict_value>.

В качестве альтернативы, вы можете создать шаблон редактора для dict_value, а затем на ваш взгляд, просто сделать:

@Html.EditorFor(m => m.dict_value) 

dict_value Где есть вся ваша коллекция. Razor отобразит экземпляр шаблона редактора для каждого члена коллекции и правильно проиндексирует все.

Смежные вопросы