2

在 asp.net 中,当我使用母版页时,我可以使用后面的母版页代码来运行共享代码。在 MVC 中我该怎么做。所有页面都使用 layout.cshtml 但没有任何共享控制器。

在我的布局中,我有一些必须从数据库加载的数据,但是没有地方可以编写这些代码并填充 viewbag 以将数据发送到 layout.cshtml

<div class="page">
    <header  >
        <div id="title">
            <h1>Management</h1>
        </div>
        <div id="logindisplay">
            @Html.Partial("_LogOnPartial")
        </div>
    <br />
    <br />
        <nav>
            <ul id="menu">
                       // these data must load from db
            </ul>
        </nav>
    </header>
    <section id="main">
        @RenderBody()
    </section>
    <footer>
    </footer>
</div>
4

4 回答 4

3

在共享目录中,您可以放置​​将在您的 Web 应用程序中使用的所有文件(如母版页和部分视图),希望在它们被多次使用的情况下(用于部分视图)。没有共享控制器,但您可以创建一个 CommonController 来处理菜单等内容。

我不知道您需要在视图中显示哪些其他数据,但看看您的示例,您似乎想在 ul 标记中显示菜单项。

我会有一个代表菜单项的类,例如:

public class MenuItem
{
     public int MenuId { get; set; }
     public string MenuName { get; set; }
}

我总是为每个视图创建一个视图模型。这更好,因为这样您就只有视图上所需的字段。永远不要将您的域对象直接发送到视图。

视图模型看起来像这样,它可以包含许多其他属性,但对于这个演示,我将只包含 meu 项。

public class MyViewModel
{
     // This will contain the menu items that you want displayd in your view
     public IEnumerable<MenuItem> MenuItems { get; set; }
}

您的操作方法(在称为 CommonController 之类的控制器中):

public ActionResult MyActionMethod
{
     MyViewModel viewModel = new MyViewModel
     {
          // Here you do a database call to populate your menu items
          // This GetAllMenuItems method returns a list of MenuItem objects
          MenuItems = menuItemService.GetAllMenuItems()
     };

     return View(viewModel);
}

创建一个从 CommonController 获取数据的局部视图(您需要使用上面的操作方法创建它)。循环遍历 MenuItems 中的每个 MenuItem,并在 li 标签中显示名称。

<ul>

     @foreach (var item in Model.MenuItems)
     {
          <li>item.MenuName</li>
     }

</ul>

我希望这有帮助。剩下的事情我留给你做,然后阅读更多文章。互联网上有很多信息描述了您想要做什么。您只需要花时间阅读这些文章。

于 2012-04-08T18:46:03.150 回答
0

有几个选项。您可以使用局部视图(使用它自己的控制器和视图模型),也可以使用基本控制器。使用基本控制器,每个控制器都将其用作祖先,您可以使用基本控制器来加载通用数据元素。

于 2012-04-08T14:43:15.260 回答
0

我知道这篇文章很旧,但我突然遇到了同样的问题,我发现我们可以使用我正在使用 vb 的 Razor 轻松地以布局形式访问 VB。您可以为 c# 修改此代码。我正在使用@Imports System.Data.SqlClient. 这段代码对我来说非常有效,我想要你所描述的

                <li class="treeview">
                    <a href="#">
                        <i class="fa fa-indent"></i>
                        <span>Transaction</span> <i class="fa fa-angle-left pull-right"></i>

                        <span class="label label-primary pull-right"></span>
                    </a>
                    <ul class="treeview-menu scrollbar">
                        @Code
                            Using conn As New SqlConnection(connectionString)
                                Dim sSql = "SELECT * FROM SM_OBJECT_INFO WHERE menu_name = 'Transaction' Order By group_index, index_no"
                                Dim formname As String
                                Dim formtitle As String
                                Dim cmd As SqlCommand = New SqlCommand(sSql, conn)
                                conn.Open()
                                Dim rst As SqlDataReader = cmd.ExecuteReader
                                Do While rst.Read()
                                    formname = rst!form_name
                                    formtitle = rst!object_name
                                    @<li><a href=@formname>@formtitle</a></li>
                                Loop
                            End Using
                        end code
                    </ul>
                </li>
于 2015-03-31T17:32:41.687 回答
0

这篇文章对我有用——下面我正在详细写——在共享目录中,您将在您的 Web 应用程序中使用的所有文件(如母版页和部分视图)放在共享目录中,希望它们的使用次数超过一次(对于部分视图)。没有共享控制器,但您可以创建一个 CommonController 来处理菜单等内容。

我不知道您需要在视图中显示哪些其他数据,但看看您的示例,您似乎想在 ul 标记中显示菜单项。

我会有一个代表菜单项的类,例如:

public class MenuItem
{
     public int MenuId { get; set; }
     public string MenuName { get; set; }
}

我总是为每个视图创建一个视图模型。这更好,因为这样您就只有视图上所需的字段。永远不要将您的域对象直接发送到视图。

视图模型看起来像这样,它可以包含许多其他属性,但对于这个演示,我将只包含 meu 项。

public class MyViewModel
{
     // This will contain the menu items that you want displayd in your view
     public IEnumerable<MenuItem> MenuItems { get; set; }
}

您的操作方法(在称为 CommonController 之类的控制器中):

public ActionResult MyActionMethod
{
     MyViewModel viewModel = new MyViewModel
     {
          // Here you do a database call to populate your menu items
          // This GetAllMenuItems method returns a list of MenuItem objects
          MenuItems = menuItemService.GetAllMenuItems()
     };

     return View(viewModel);
}

创建一个从 CommonController 获取数据的局部视图(您需要使用上面的操作方法创建它)。循环遍历 MenuItems 中的每个 MenuItem,并在 li 标签中显示名称。

<ul>

     @foreach (var item in Model.MenuItems)
     {
          <li>item.MenuName</li>
     }

</ul>

我希望这有帮助。剩下的事情我留给你做,然后阅读更多文章。互联网上有很多信息描述了您想要做什么。您只需要花时间阅读这些文章。


这是在 MVC 中实现 asp.net 母版页功能的非常有用的文章。即,如果我们想要一个对每个页面都通用的功能[MVC 中的每个控制器/视图] 都需要遵循本文的步骤。我遇到了一次本文未提及的问题,将在下面分享 - 当我们将创建部分视图时,该部分视图将在 _layout 页面上调用以在每个视图中共享.. 我们必须写 - @{Html.RenderAction("BindMenu ", "Common");} 在 _Layout 页面上。因为我是新手,所以我试图调用部分视图,例如 - @Html.Partial("~/Views/Shared/_HeaderMenuPartial.cshtml", Model.MenuItemsList) 这不起作用。

于 2015-09-16T07:36:55.470 回答