从另一个视图渲染视图的一部分

时间:2012-06-15 13:53:05

标签: asp.net-mvc-3

我正在将我的WebForms项目转移到MVC并且很难设计东西。 我的应用程序的基本显示在_Layout中。该页面分为4个部分(比如A部分,B部分,C部分和D部分),其中3个(A,B,C)只包含html,而一个(D)是动态的。我曾使用@RenderBody来引入D部分的内容。但是,现在其他部分正在改变,我需要为这些部分分别使用控制器。将其内容显示在_Layout中的最佳方法是什么?

@ Html.RenderPartial / @ Html.Partial / @ Html.RenderAction / @ Html.Action?

我正在尝试使用 - 替换C部分 @ Html.Action(“索引”,“CController”)

但是,这不起作用。

在CController的Index.cshtml中,我的Layout = null,最初它被设置为指向_Layout.cshtml,但我读到here这就产生了问题。

将C部件放入CControllers视图后,它不会显示先前显示的基本_Layout页面。

这是CController的Index.cshtml -

<div id="noteContainerDiv">
    Here goes all the data to display
</div>

这是CController.cs的代码 -

public class CController : Controller
{        
    public ActionResult Index()
    {
        return PartialView();
    }

}

有人能提出正确的设计方法吗?

2 个答案:

答案 0 :(得分:0)

您可以做的是为子视图(您调用D的视图模型)创建一个视图模型,并从布局视图中传入此视图模型。

即。通过在_Layout中执行类似的操作:

@Html.Partial("_SubviewD", Model.SubviewDModel)

然后很明显在您的控制器中,您需要初始化此子视图模型并将其包含在您的模型中(或者,在ViewBag中 - 建议为邪恶道歉!)您甚至可以找到方法来执行此操作而无需更改所有控制器(例如通过基本的Controller类并覆盖OnActionExecuted)。

答案 1 :(得分:0)

有很多方法可以做到这一点。但我会坚持你的初步方法。

让CController Index操作返回PartialViewResult而不是完整结果。

您没有为部分视图设置布局。所以在你的CController索引动作中你会有这样的东西:

var model = ....
return this.PartialView("NameOfYourPartialView", yourModel);

当你打电话

@Html.Action("Index", "CController")

一切都应该好,很酷?