2017-10-10 77 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很高興你喜歡它,它的工作。 –