我如何在layout.cshtml中使用数据库数据

时间:2012-04-08 14:39:32

标签: asp.net-mvc asp.net-mvc-3 razor

在asp.net中,当我使用masterpages时,我可以使用后面的母版页代码来运行共享代码。 在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 个答案:

答案 0 :(得分: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>

我希望这会有所帮助。其余的我留给你做其余的事情并阅读更多的文章。互联网上有许多信息描述了你想要做的事情。你只需要花时间阅读这些文章。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我知道这篇文章已经过时但是我遇到了同样的问题我得到了我们可以使用Razor轻松访问布局形式的VB我正在使用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>

答案 3 :(得分: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(&#34; BindMenu&#34;,&#34; Common&#34;);} 在_Layout页面上。 因为我是新手而且我试图将局部视图称为 -    @ Html.Partial(&#34;〜/ Views / Shared / _HeaderMenuPartial.cshtml&#34;,Model.MenuItemsList) 这是行不通的。