Теперь это исправлено. Комбинация предложения 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);
}
Показать ваш код. – haim770
Пожалуйста, разместите код. Только тогда мы сможем помочь вам в том, где вы ошибаетесь. – RKS