Как передать модель в частичный вид
У меня две модели представлений:
public class ParentViewModel
{
public Id { get; set; }
.....
public ChildViewModel Child{ get; set; }
}
public class ChildViewModel
{
public ChildId { get; set; }
.....
}
Контроллеры:
public ActionResult Index()
{
.... <some code>
return View("NewIndex", ParentViewModel);
}
[HttpPost]
public ActionResult PartialAction(ChildViewModel childView)
{
return RedirectToAction("Index");
}
И просмотры:
Индекс
@model ParentViewModel
....
@Html.Partial("_Partial", Model.Child)
и _Partial
@model ChildViewModel
... do some stuff with child model
Когда я пытаюсь открыть страницу Index, у меня есть ошибка:
Элемент модели, переданный в словарь, имеет тип "ParentViewModel", но для этого словаря требуется элемент модели типа "ChildViewModel".
Почему он пытается передать ParentViewModel вместо ChildViewModel. Что я делаю неправильно?
Ответы
Ответ 1
У меня была такая же проблема, как и у OP. Из одного из комментариев я понял, что второй параметр не должен быть нулевым, т.е. Из
@model ParentViewModel
@Html.Partial("_Partial", Model.Child)
Если Model.Child имеет значение null, вместо Model.Child передается Модель. Если будут случаи, когда второй параметр равен нулю, тогда вам нужно будет сначала проверить свой код и, возможно, передать инициализированный Child в качестве второго параметра. Что-то вроде этого
@Html.Partial("_Partial", new Child())
Ответ 2
Ответ заключается в том, что нужно передать пустой объект Partial, например
@Html.Partial("_Partial", new ChildViewModel ())
Ответ 3
Вместо этого вы можете вернуть PartialView("...")
из Controller
и вызвать действие из представления Index.
Контроллеры:
public ActionResult Index()
{
.... <some code>
return View("NewIndex", ParentViewModel);
}
public ActionResult Partial(ChildViewModel cvm)
{
var vm = cvm ?? new ChildViewModel(); //if cvm from the parent view is null, return new cvm
return PartialView("_Partial", vm) //return partial view
}
[HttpPost]
public ActionResult PartialAction(ChildViewModel childView)
{
return RedirectToAction("Index");
}
И индекс
@model ParentViewModel
....
@Html.Action("Partial", Model.Child)
В качестве альтернативы вы можете инициализировать ParentViewModel в Index()
public ActionResult Index()
{
.... <some code>
return View("NewIndex", new ParentViewModel{Child = new ChildViewModel});
}