Подтвердить что ты не робот

Как передать модель в частичный вид

У меня две модели представлений:

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. Что я делаю неправильно?

4b9b3361

Ответ 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});
}