2017-10-10 74 views
0

我想在同一时间更新两个模型。如何在ASP.NET MVC 5实体框架中同时更新多个模型

型号:

一个网页上有多个领域,我希望他们能够在同一时间更新。

public class PageEditViewModel 
{ 
    public Page mPage { get; set; } 

    public IEnumerable<Field> Fields { get; set; } 
} 

这是我的观点:

<div class="row"> 
          <div class="col-md-12"> 
           <h3>Fields</h3> 
           @foreach (var field in Model.ContentFields) 
           { 
            @Html.HiddenFor(m => field.Id) 

            switch (field.FieldType) 
            { 
             case "TextBox": 

              <div class="form-group"> 
               <label class="control-label"> 
                @field.FieldName<span class="required"> * </span> 

               </label> 
               @Html.TextBoxFor(m => field.Content , new { @class = "form-control" }) 
              </div> 
              break; 

             case "TextArea": 
              <div class="form-group"> 
               <label class="control-label"> 
                @field.FieldName<span class="required"> * </span> 
               </label> 
               @Html.TextAreaFor(m => field.Content, new { @class = "form-control" }) 
              </div> 
              break; 

             case "Image": 
              <div class="form-group"> 
               <label class="control-label"> 
                @field.FieldName<span class="required"> * </span> 
               </label> 
               <input type="file" name="contentImage" id="cImage" class="form-control" accept="image/*" /> 
              </div> 
              break; 
            } 
           } 
          </div> 

         </div> 

和控制器:

public ActionResult Update(PageEditViewModel viewModel) 
{ 
    if (!ModelState.IsValid) 
    { 
     var page = _context.MenuPages.Single(s => s.Id == viewModel.mPage.Id); 
     var contentFields = _context.ContentFields.Where(c => c.MenuPageId == page.Id); 

     var viewM = new PageEditViewModel 
     { 
      DashboardHeading = "Edit a Page", 
      mPage = page, 
      ContentFields = contentFields 
     }; 
     return View("EditPage", viewM); 
    } 


    var pageEdit = _context.MenuPages.SingleOrDefault(p => p.Id == viewModel.mPage.Id); 

    pageEdit.Name = viewModel.mPage.Name; 
    pageEdit.IsActive = viewModel.mPage.IsActive; 
    pageEdit.IsShowInMenu = viewModel.mPage.IsShowInMenu; 

    //   _context.SaveChanges(); 

    foreach (var field in viewModel.ContentFields) 
    { 
     var cfield = _context.ContentFields.SingleOrDefault(f => f.Id == field.Id); 

     cfield.Content = field.Content; 

    } 
    _context.SaveChanges(); 

当我发送数据从景观到控制器,我得到的页面数据,但是空的字段模型(对象引用未设置为实例...)。

我期待着来自会员的任何指导。

谢谢。

+0

有相当相似类型的问题在这里找到:https://stackoverflow.com/questions/18237945/how-to-edit-save-viewmodels-data-back-to - 数据库 – jyrkim

+0

@GertArnold让我在这里添加更多的代码。 – Aleem

+0

@GertArnold我已经更新了这个问题,请看看。 – Aleem

回答

0

您需要更换@foreach环路上查看

@foreach (var field in Model.ContentFields) 
          { 

通过对循环

@for (var i = 0; i < Model.ContentFields.Count; i++) 
      { 

这将绑定你的列表模式,而将数据发送到控制器

+0

谢谢,它为我工作。 – Aleem

1

我觉得Umesh制作答案是正确的。 改变你的循环后,你如何设置你的Html.TextBoxFor,HiddenFor等?

它应该是:

@Html.HiddenFor(m => m.ContentFields[i].Id) 
+0

如果你愿意,我在我的博客中有一篇关于这个的文章:) http://debuxing.com/model-binding-to-a-list-of-objects/ –

+0

非常感谢,它为我工作。 您的博客非常棒。 :) – Aleem

+0

非常感谢@Aleem很高兴你喜欢它,它的工作。 –