ASP.NET从母版页调用控制器方法?

时间:2011-02-19 09:20:39

标签: c# asp.net-mvc master-pages partial-views

在ASP.NET MVC2中,如何从母版页调用控制器方法?比方说,我想在主数据库中包含一些概述数据:

+--------------------------------------+
| Logo                      Welcome xyz|
+--------------------------------------+
| total sales this month $999          |
+--------------------------------------+
| Home | Sales | Import | Export (menu)|
+--------------------------------------+

我在Sales控制器里面有这个方法:

public ActionResult TotalSalesThisMonth()
{
    var totalSalesModel = SalesService.GetTotalSalesThisMonth()
    return View(totalSalesModel);
}

如何从主控内部调用该视图,以便它显示在每个页面上?

2 个答案:

答案 0 :(得分:3)

您可以使用Html.Action or Html.RenderAction助手。例如,您可以将以下内容放在母版页上:

<%= Html.Action("TotalSalesThisMonth", "SomeController") %>

这将执行控制器操作,呈现视图并将生成的HTML插入母版页中的指定位置。您还可以通过使用[ChildActionOnly]属性进行装饰来限制此操作仅用作子操作:

[ChildActionOnly]
public ActionResult TotalSalesThisMonth()
{
    var totalSalesModel = SalesService.GetTotalSalesThisMonth()
    return View(totalSalesModel);
}

最后,如果在控制器操作中你想测试它是作为正常动作还是作为子动作调用,你可以这样做:

public ActionResult TotalSalesThisMonth()
{
    var totalSalesModel = SalesService.GetTotalSalesThisMonth()
    if (ControllerContext.IsChildAction)
    {
        return View("foo", totalSalesModel);
    }
    return View("bar", totalSalesModel);
}

答案 1 :(得分:1)

引自http://haacked.com/archive/2009/11/18/aspnetmvc2-render-action.aspx

  

我将使用术语RenderAction来引用这两种方法。以下是您可以如何使用此方法的快速浏览。假设您有以下控制器。

public class MyController {
  public ActionResult Index() {
    return View();
  }

  [ChildActionOnly]
  public ActionResult Menu() {
    var menu = GetMenuFromSomewhere();
      return PartialView(menu);
  }
}
  

“菜单”操作会抓取“菜单”模型并返回仅包含菜单的局部视图。

<%@ Control Inherits="System.Web.Mvc.ViewUserControl<Menu>" %>
<ul>
<% foreach(var item in Model.MenuItem) { %>
  <li><%= item %></li>
<% } %>
</ul>
  

在Index.aspx视图中,您现在可以调用菜单操作以显示菜单:

<%@ Page %>
<html>
<head><title></title></head>
<body>
  <%= Html.Action("Menu") %>
  <h1>Welcome to the Index View</h1>
</body>
</html>

以上内容根据CC-BY获得许可:http://creativecommons.org/licenses/by/2.5/