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を渡そうとする理由。私が間違っているのは何ですか?
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())
答えは、空のオブジェクトをPartialに渡す必要があるということです。
@Html.Partial("_Partial", new ChildViewModel ())
代わりに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});
}
_