【问题标题】:How to pass model to partial view如何将模型传递给局部视图
【发布时间】:2014-02-05 23:57:22
【问题描述】:

我有两个视图模型:

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)

和_部分

@model ChildViewModel
... do some stuff with child model

当我尝试打开索引页面时出现错误:

传入字典的模型项属于“ParentViewModel”类型,但该字典需要一个“ChildViewModel”类型的模型项。

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

【问题讨论】:

  • 调用时Model.Child为空?因为Html.Partial 的第二个参数不应该是null...所以让你知道你的Child 属性有一些价值!
  • 实际上我的 Partial 视图仅用于 AddObject 功能,因此 ChildViewModel 只需要从 PartialView 向控制器发送数据。所以不需要将 Child 中的数据从 Index 传递到 Partial 视图
  • 您仍然需要将 ChildViewModel 传递给 @Html.Partial 调用。但是它可以是一个空对象:@Html.Partial("_Partial", new ChildViewModel ())...

标签: asp.net-mvc partial-views asp.net-mvc-viewmodel


【解决方案1】:

我遇到了与 OP 相同的问题。从其中一个 cmets 中,我意识到第二个参数不应该为空,即来自

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

如果 Model.Child 为 null,则传递 Model 而不是 Model.Child。如果存在第二个参数为空的情况,那么您必须首先检查您的代码,并可能将初始化的 Child 作为第二个参数传递。像这样的

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

【讨论】:

  • 一直在苦苦挣扎,没有意识到 null 孩子会导致同样的错误。谢谢!
  • @Html.Partial("_Partial", Model.Child ?? new Child()) 怎么样?
【解决方案2】:

答案是需要给Partial传一个空对象,比如

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

【讨论】:

    【解决方案3】:

    您可以改为从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() 中初始化 ParentViewModel 公共动作结果索引()

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多