【问题标题】:ASP.NET call a controller method from the master page?ASP.NET 从母版页调用控制器方法?
【发布时间】:2011-02-19 09:20:38
【问题描述】:

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

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

我在销售控制器内部有这个方法:

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

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

【问题讨论】:

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


    【解决方案1】:

    您可以使用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);
    }
    

    【讨论】:

    • 啊哈我不知道你可以在master里面使用Html.Action,谢谢:)
    • @JK,您可以在包括母版页在内的每个视图上使用它。
    【解决方案2】:

    引用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);
      }
    }
    

    Menu 动作抓取 Menu 模型并返回仅包含菜单的局部视图。

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

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

    <%@ 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/

    【讨论】:

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