2017-10-10 5 views
0

두 모델을 동시에 업데이트하려고합니다.ASP.NET MVC 5에서 여러 모델을 동시에 업데이트하는 방법 Entity Framework

모델 :

  1. 페이지

한 페이지에 여러 필드가

  • 필드, 나는 그들이 동시에 업데이트 할. 필드에 내가 컨트롤러보기에서 데이터를 보내면

    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(); 
    

    , 내가 페이지에 대한 데이터를 얻을 수 있지만 널 :

    <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 class PageEditViewModel 
    { 
        public Page mPage { get; set; } 
    
        public IEnumerable<Field> Fields { get; set; } 
    } 
    

    내보기입니다 모델 (개체 참조가 인스턴스로 설정되지 않았습니다 ...).

    회원들로부터 어떤 가이드가 오기를 고대하고 있습니다.

    감사합니다. 데이터를 전송하는 동안

  • +0

    여기 질문의 매우 유사한 유형있다 : https://stackoverflow.com/questions/18237945/how-to-edit-save-viewmodels-data-back-to -database – jyrkim

    +0

    @GertArnold 여기에 더 많은 코드를 추가하겠습니다. – Aleem

    +0

    @GertArnold 질문을 좀 업데이트 해주세요. – Aleem

    답변

    0

    당신은 내가 Umesh 생각

    +0

    고마워, 그것은 나를 위해 일했다. – Aleem

    1

    을 컨트롤러로,이 모델 목록을 바인딩

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

    루프으로보기

    @foreach (var field in Model.ContentFields) 
              { 
    

    에 @foreach 루프를 교체해야 대답은 정확합니다. 루프를 변경 한 후 Html.TextBoxFor, HiddenFor 등을 어떻게 설정하고 있습니까?

    그것은해야한다 :

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

    원한다면 나는 내 블로그에 이것에 관한 게시물을 가지고있다. :) http://debuxing.com/model-binding-to-a-list-of-objects/ –

    +0

    고마워, 그것은 나를 위해 일했다. 블로그가 우수합니다. :) – Aleem

    +0

    고맙습니다. 당신이 좋아하고 그것이 효과가 있다는 것을 기쁘게 생각합니다. –