web-dev-qa-db-ja.com

モデルを部分ビューに渡す方法

2つのビューモデルがあります。

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

インデックスページを開こうとすると、エラーが発生します。

ディクショナリに渡されるモデルアイテムのタイプは「ParentViewModel」ですが、このディクショナリには「ChildViewModel」タイプのモデルアイテムが必要です。

ChildViewModelの代わりにParentViewModelを渡そうとする理由。私が間違っているのは何ですか?

32
DarkNik

OPと同じ問題がありました。コメントの1つから、2番目のパラメータがnullであってはならないこと、つまり

@model ParentViewModel
@Html.Partial("_Partial", Model.Child)

Model.Childがnullの場合、Model.Childの代わりにModelが渡されます。 2番目のパラメーターがnullの場合がある場合、最初にコードをチェックし、初期化されたChildを2番目のパラメーターとして渡す必要があります。このようなもの

@Html.Partial("_Partial", new Child())
43
Dev

答えは、空のオブジェクトをPartialに渡す必要があるということです。

@Html.Partial("_Partial", new ChildViewModel ())
14
DarkNik

代わりにControllerからPartialView("...")を返し、インデックスビューからアクションを呼び出すことができます。

コントローラー:

_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)
_

または、Index() public ActionResult Index()でParentViewModelを初期化することもできます

_{
    .... <some code>
    return View("NewIndex", new ParentViewModel{Child = new ChildViewModel});
}
_
0
dey.shin