2014-04-03 3 views
0

Теперь это исправлено. Комбинация предложения Ish ниже плюс добавление звонков в @HiddenFor в разрешении проблемы.ViewModel Свойство Null in Post Действие

У меня есть веб-приложение ASP.NET MVC 5, где пользователи могут отмечать дефект как разрешенный. Я хочу отобразить список потенциально связанных дефектов с флажками, которые пользователи могут указывать, чтобы указать, что да, это тот же самый дефект, и также должен быть помечен как разрешенный.

Таким образом, у меня есть модель вида с свойством, которое представляет собой коллекцию, каждый член которой содержит свойство объекта дефекта и свойство Boolean IsSameDefect. Все это прекрасно работает в методе действия GET и в представлении. Я могу показать связанные дефекты и пометить поля.

Проблема возникает в действии POST, когда я хочу обновить данные. На этом этапе свойство (совокупность потенциально связанных дефектов) является нулевым. Я с трудом пытаюсь понять, как передать эти данные контроллеру?

код с просьбой ...

// GET: /DefectResolution/Create 
public ActionResult Create(int ciid) 
{ 
    int companyId = User.CompanyID(); 
    DefectResolutionCreateViewModel drcvm = new DefectResolutionCreateViewModel(ciid, companyId); 
    return View(drcvm); 
} 

// POST: /DefectResolution/Create 
[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create(DefectResolutionCreateViewModel drcvm) 
{ 
    DefectResolutions currentResolution = drcvm.DefectResolution; 
    currentResolution.CreatedOn = System.DateTime.Now; 
    currentResolution.UserID = User.UserID(); 

    if (ModelState.IsValid) 
    { 
     unitOfWork.DefectResolutionRepository.Insert(currentResolution); 

     if (currentResolution.ResolutionStatusID == 2) 
     { 
      //code breaks here as drcvm.RelatedUnresolvedDefects is null 
      foreach (var relatedDefect in drcvm.RelatedUnresolvedDefects) 
      { 
       if (relatedDefect.IsSameDefect) 
       { 
        DefectResolutions relatedResolution = new DefectResolutions(); 
        relatedResolution.ChecklistID = relatedDefect.RelatedChecklist.ChecklistID; 
        relatedResolution.CreatedOn = System.DateTime.Now; 
        relatedResolution.ResolutionNote = currentResolution.ResolutionNote; 
        relatedResolution.ResolutionStatusID = currentResolution.ResolutionStatusID; 
        relatedResolution.UserID = User.UserID(); 
       } 
      } 
     } 

     unitOfWork.Save(); 
     return RedirectToAction("Index", new { ciid = currentResolution.ChecklistID }); 
    } 
    return View(drcvm); 
} 

По мнению ...

@model Blah.ViewModels.DefectResolution.DefectResolutionCreateViewModel 
@{ 
    ViewBag.Title = "Create Defect Resolution"; 
    var relatedDefects = Model.RelatedUnresolvedDefects; 
} 

..., а затем в представлении ...

@for (int i = 0; i < relatedDefects.Count(); i++) 
{ 
    <tr> 
     <td> 
      @Html.EditorFor(x => relatedDefects[i].IsSameDefect) 
     </td> 
    </tr> 
}      

Я последовал Иш ниже, и изменил код, чтобы ссылаться на Model.RelatedUnresolvedDefects прямо, вместо того, чтобы использовать переменную, как я был doin г. Это меня немного улучшает. Свойство RelatedUnresolvedDefects модели представления больше не равно null. Но имеет значение только связанноеUnresolvedDefects.IsSameDefect. СвязанныйUnresolvedDefects.RelatedChecklist имеет значение null. Вот код, контроллер снова показывая, где он теперь разбивается ...

// POST: /DefectResolution/Create 
[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create(DefectResolutionCreateViewModel drcvm) 
{ 
    DefectResolutions currentResolution = drcvm.DefectResolution; 
    currentResolution.CreatedOn = System.DateTime.Now; 
    currentResolution.UserID = User.UserID(); 

    if (ModelState.IsValid) 
    { 
     unitOfWork.DefectResolutionRepository.Insert(currentResolution); 

     if (currentResolution.ResolutionStatusID == 2) 
     { 
      //prior to change, code used to break here 
      foreach (var relatedDefect in drcvm.RelatedUnresolvedDefects) 
      { 
       if (relatedDefect.IsSameDefect) 
       { 
        DefectResolutions relatedResolution = new DefectResolutions(); 

        //code now breaks here because relatedDefect.RelatedChecklist is null 
        relatedResolution.ChecklistID = relatedDefect.RelatedChecklist.ChecklistID; 
        relatedResolution.CreatedOn = System.DateTime.Now; 
        relatedResolution.ResolutionNote = currentResolution.ResolutionNote; 
        relatedResolution.ResolutionStatusID = currentResolution.ResolutionStatusID; 
        relatedResolution.UserID = User.UserID(); 
       } 
      } 
     } 

     unitOfWork.Save(); 
     return RedirectToAction("Index", new { ciid = currentResolution.ChecklistID }); 
    } 
    return View(drcvm); 
} 
+1

Показать ваш код. – haim770

+1

Пожалуйста, разместите код. Только тогда мы сможем помочь вам в том, где вы ошибаетесь. – RKS

ответ

1

Не зная ваши code.I предложить вам использовать for петлю вместо foreach при визуализации дефектов в View (.cshtml).

Редактирование ответа на основе вашего кода.
После выступления в создании представления проблемы

var relatedDefects = Model.RelatedUnresolvedDefects; 

Вы должны непосредственно перебрать Model.RelatedUnresolvedDefects собственности в петле.

   @for (int i = 0; i < Model.RelatedUnresolvedDefects.Count(); i++) 
         { 
          <tr> 
           <td> 
            @Html.EditorFor(x => Model.RelatedUnresolvedDefects[i].IsSameDefect) 
           </td> 
          </tr> 
         } 
+0

Мне пришлось добавить кучу @ Html.HiddenFor звонков в представление, но это в сочетании с предложением Иша выше разрешило проблему, спасибо! –

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