将数据从Html.Action传递到局部视图

3

我是一名相对新手,对MVC 3还不太熟悉。我需要通过控制器将数据从@Html.Action方法传递到一个局部视图。

我的流程如下:

我会像这样调用@Html.Action:

@Html.Action("SidebarMain", "Home", new List<int>(new int[] {1, 2, 3}))

那么它将会触发我的控制器。这是我的主页控制器中的方法:
public ActionResult SidebarMain(List<int> items)
{
    return View(items);
}

然后我的部分视图应该能够像这样访问数据:
@model List<int>

@{
    ViewBag.Title = "SidebarMain";
    Layout = null;
}

<div>
@foreach (int item in Model)
{
    <div>@item</div>
}
</div>

但是:我得到了一个有关模型的空引用异常,这意味着它没有通过。

4个回答

5

试试这个:

Html.Action("SidebarMain", "Home", new { items = new List<int>(new int[] {1, 2, 3}) })

在SidebarMain操作中设置一个断点,查看是否获取到items


1
简而言之:您的代码在Html.Action()中缺少items参数名称。除此之外,代码应该是可用的。
Html.Action("SidebarMain", "Home", new {items = new List<int>(new int[] {1, 2, 3}) })

作为建议实践,我会在视图中使用专用的ViewModel而不是仅发送整数数组。因为,在这种干净的ViewModel方式下——一个包含您在视图中显示的属性的容器,您的代码可能会稍后添加其他属性,因为我们的代码总是在不断发展。
参考使用ViewModel概念的说明:练习5:创建ViewModel

只是为了澄清,您所说的ViewModel是指视图强类型化的模型,对吗? - David L
是的,你说得对,那个点在我的第二段中试图被澄清/提到。 - Yusubov
1
哇,谢谢。我没意识到视图中的参数名必须与控制器中的相同。 - coggicc

0

DarthVader的回答很好。你是通过Ajax返回它吗?如果你将它嵌入到主视图中,你应该真正地将它作为PartialView返回。

return PartialView("SidebarMain", model);

这里的SidebarMain是您返回的部分视图的名称。尝试与DarthVader建议的结合使用,并确保获取模型以传递回视图。

发布后,我意识到您正在使用Html.Action。如果这是一个真正的侧边栏,则应该通过ajax作为部分视图加载,并且您应该调用

Ajax.ActionLink("SidebarMain", "Home", new { items = new List<int>(new int[] {1, 2, 3}) })

这将允许您留在当前页面。如果您不需要ajax功能,我为跑题道歉:)


0

DarthVader的建议可能有效。这是我最终采取的做法:

1)移除控制器

2)像这样调用它:

@{Html.RenderPartial("SidebarMain", new int[] {1,3,4,2});}

3) 这是我的视图代码:

@model int[]
@foreach( int item in Model){
...

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