如何在共享视图中使用“控制器” - Asp.Net Mvc

40
我在我的_Layout.cshtml中有一个名为"_Header.cshtml"的共享视图。
我想要从数据库中显示文本和图像,所以需要我的控制器进入数据库并将其返回到_Header.cshtml。
因为每个页面用户访问时调用的控制器都不同,所以如何实现此功能呢? 是否有办法使用共享视图来创建控制器?
这是_Layout.cshtml:
    <div id="header">
        <div id="title">
            @Html.Partial("_Header")
        </div>

        <div id="logindisplay">
           @Html.Partial("_CultureChooser")
            <br />
           @Html.Partial("_LogOnPartial")
        </div>

        <div id="menucontainer">
           @Html.Partial( "_MenuPartial")
        </div>
    </div>

    <div id="main">
        @RenderBody()
        <div id="footer">
        </div>
    </div>

</div>

5个回答

60
在您的控制器操作中,您可以指定视图的名称:
public class MenuController : Controller
{
    [ChildActionOnly]
    public ActionResult Header()
    {
        var model = ... // go to the database and fetch a model
        return View("~/Views/Shared/_Header.cshtml", model);
    }
}

现在,在您的_Layout.cshtml中,不要使用@Html.Partial("_Header"),请改为:

@Html.Action("Header", "Menu")

我在问题中添加了_Layout.cshtml。它不是在点击时出现,而是在整个网站中都存在。 - Patrick Desjardins
1
@Daok,你所说的“click”是什么意思?你可以在布局中使用@Html.Action辅助方法来调用相应控制器上的子操作。这比简单的Html.Partial更强大,因为你可以为站点的这个部分定义一个独立的控制器/模型和视图,而且它与主控制器无关。你可以查看以下关于子操作的博客文章:http://haacked.com/archive/2009/11/18/aspnetmvc2-render-action.aspx - Darin Dimitrov
谢谢,我还需要学习MVC :P 我现在遇到了这个错误:执行' System.Web.Mvc.HttpHandlerUtil + ServerExecuteHttpHandlerAsyncWrapper '处理程序的子请求时出错。 - Patrick Desjardins
3
现在它可以工作了,我返回的是View()而不是PartialView()。 - Patrick Desjardins
@DarinDimitrov,我遇到了这个错误:{堆栈不足,无法安全地继续执行程序。这可能是由于调用堆栈上有太多函数或堆栈上的函数使用了太多堆栈空间引起的},我该怎么办? - QMaster
显示剩余2条评论

11

...一年后,我只想向Dimitrov的答案添加一件事。你可以使控制器更加简洁:

public class MenuController : Controller
{
    [ChildActionOnly]
    public ActionResult Header()
    {
        var model = ... // go to the database and fetch a model
        return Partial("_Header", model);
    }
}

2
你救了我,就是我认为它必须是 { return PartialView("_Header", model); } 我没有找到Partial方法,我错了吗? - QMaster

2
在您的控制器中创建一个操作以呈现标题视图,然后在_Layout.cshtml中简单地调用@Html.RenderAction("Header")即可。
如果需要,您还可以将模型传递给RenderAction方法。

0

我希望你提出的问题是这样的...... 我们可以为共享布局视图创建控制器吗。

简单的答案是否定的。

要实现这个目标,您必须为相同的目的创建一个部分视图,并将其放入共享布局中。通过这种方式,您可以实现您的目标。


0

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