如何将模型传递给局部视图

43

我有两个视图模型:

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'的模型项。

为什么它试图传递ParentViewModel而不是ChildViewModel。我做错了什么?


3
什么情况下 Model.Child 为空?因为 Html.Partial 的第二个参数不应该是 null...所以确保你的 Child 属性有一些值! - nemesv
实际上我的Partial View仅用于AddObject功能,所以ChildViewModel只需要用于从Partial View向Controller发送数据。因此不需要在Index和Partial View之间传递数据给Child。 - DarkNik
1
你仍然需要将ChildViewModel传递给@Html.Partial调用。但是它可以是一个空对象:@Html.Partial("_Partial", new ChildViewModel())... - nemesv
3个回答

55
我遇到了与OP相同的问题。从评论中,我意识到第二个参数不应该为null,也就是说从

开始应该有第二个参数。
@model ParentViewModel
@Html.Partial("_Partial", Model.Child)

如果 Model.Child 为 null,则传递 Model 而不是 Model.Child。如果有时第二个参数可能为 null,则在代码中必须先检查并可能将一个初始化的 Child 作为第二个参数传递。类似这样:

如果 Model.Child 为 null,则传递 Model 而不是 Model.Child。如果有时第二个参数可能为 null,则在代码中必须先检查并可能将一个初始化的 Child 作为第二个参数传递。类似这样:

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

1
我曾经为此苦苦挣扎,却没有意识到一个空的子节点会导致相同的错误。谢谢! - Chris V.
6
这句话的意思是:如何处理 @Html.Partial("_Partial", Model.Child ?? new Child()) 代码?其中的问号问一个条件语句,意思是如果 Model.Child 不为空,则使用它,否则创建一个新的 Child 对象。@Html.Partial 是在 ASP.NET MVC 中用于加载局部视图的方法。 - wensveen

14
答案是需要传递一个空对象给Partial,如下所示:
@Html.Partial("_Partial", new ChildViewModel ())

2
你可以从Controller中返回PartialView("..."),然后从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)

或者,您可以在Index()中初始化ParentViewModel
public ActionResult Index()

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接