C#ASP.netmvc3中的动态菜单 解释

C#ASP.netmvc3中的动态菜单 解释,c#,asp.net-mvc,razor,C#,Asp.net Mvc,Razor,我正在尝试创建一个动态菜单,从数据库加载项。 菜单中最多需要3个级别,如下所示: <ul> <li>Home</li> <li>Peoples <ul> <li>Employee <ul> <li>Create</li> <li>List</li>

我正在尝试创建一个动态菜单,从数据库加载项。 菜单中最多需要3个级别,如下所示:

<ul>
   <li>Home</li>
   <li>Peoples
      <ul>
         <li>Employee
            <ul>
              <li>Create</li>
              <li>List</li>
              <li>Edit</li>
            </ul>
         </li>
         <li>Training</li>
         <li>Material Requisition</li>
      </ul>
   </li>
</ul
@Html.Partial("TopBar", model)
所有这些都会产生一个空白列表,就像一个干净的数据库。 但是,当我调用一个动作列表时,例如发生冲突,因为booth视图(“List.cshtml”和“TopBar.cshtml”)的开头是:

@model IEnumerable<SIGO.Models.Employee>
@model IEnumerable

@model IEnumerable
注意:我不使用任何控制器将数据处理到TopMenu

问题
  • 我怎么做这个TopMenu
  • 你还有别的解决办法吗

谢谢!很抱歉翻译中出现错误

您需要将模型传递到局部视图。相反,此条件将始终为假,且不会提供任何内容:

@if (Model != null)
因此,您需要如下方式渲染视图:

<ul>
   <li>Home</li>
   <li>Peoples
      <ul>
         <li>Employee
            <ul>
              <li>Create</li>
              <li>List</li>
              <li>Edit</li>
            </ul>
         </li>
         <li>Training</li>
         <li>Material Requisition</li>
      </ul>
   </li>
</ul
@Html.Partial("TopBar", model)
在您的情况下,由于此代码位于布局视图中,因此无法获取
模型

实现这一点的唯一合理方法是创建一个控制器来提供模型。如果这样做,则应使用
Action
RenderAction
(),而不是使用
Partial
。即,按如下方式实施:

<ul>
   <li>Home</li>
   <li>Peoples
      <ul>
         <li>Employee
            <ul>
              <li>Create</li>
              <li>List</li>
              <li>Edit</li>
            </ul>
         </li>
         <li>Training</li>
         <li>Material Requisition</li>
      </ul>
   </li>
</ul
@Html.Partial("TopBar", model)
  • 创建带有
    菜单的
    菜单控制器
    ,该操作返回呈现菜单的
    部分视图。在此操作内创建模型,并使用
    返回部分(“菜单”,模型)
    ,其中
    “菜单”
    指的是
    “Menu.cshtml”
    视图,模型具有呈现此视图所需的数据。此操作将呈现菜单
  • 使用
    Html.RenderAction(“菜单”、“菜单”)
    在布局中呈现菜单。第一个
    “Menu”
    参数表示操作名称,第二个参数表示控制器

创建一个单独的控制器/操作方法来构造菜单,并使用
@Html.action()
调用它。比如说

public class MenuController : Controller
{
  [ChildActionOnly]
  public ActionResult Index()
  {
    // Build your menu model;
    return PartialView(model);
  }
}
然后在你的布局中

@Html.Action("Index", "Menu")
你可以这样试试。 我正在使用这个,它是有效的

视图代码

<ul id="nav">
        @foreach (var p in Model.Where(a => a.MENU_MASTER.PARENT_ID == 0))
        {

            if (Model.Where(a => a.MENU_MASTER.PARENT_ID == p.MENU_MASTER.OBJECT_ID).Any())
            {
            <li class="has-sub"><a href="#">@p.MENU_MASTER.OBJECT_NAME</a>
                <ul>
                    @foreach (var c in Model.Where(g => (g.MENU_MASTER.PARENT_ID == p.MENU_MASTER.OBJECT_ID)))
                    {
                        if (Model.Where(a => a.MENU_MASTER.PARENT_ID == c.MENU_MASTER.OBJECT_ID).Any())
                        {
                        <li class="has-sub"><a href="#"><span>@c.MENU_MASTER.OBJECT_NAME</span></a>
                            <ul>
                                @foreach (var d in Model.Where(a => a.MENU_MASTER.PARENT_ID == c.MENU_MASTER.OBJECT_ID))
                                {
                                    <li><a  href="@Url.Action(@d.MENU_MASTER.ACTION_NAME, @d.MENU_MASTER.CONTROLLER_NAME)">
                                        <span>@d.MENU_MASTER.OBJECT_NAME</span></a> </li>
                                }
                            </ul>
                        </li>

                        }
                        else
                        {
                        <li><a  href="@Url.Action(@c.MENU_MASTER.ACTION_NAME, @c.MENU_MASTER.CONTROLLER_NAME)">
                            <span>@c.MENU_MASTER.OBJECT_NAME</span></a> </li>  
                        }

                    }
                </ul>
            </li>
            }
            else
            {
            <li><a class="hsubs" href="#">@p.MENU_MASTER.OBJECT_NAME</a></li>
            }

        }
    </ul>
    @foreach(模型中的var p.Where(a=>a.MENU\u MASTER.PARENT\u ID==0)) { if(Model.Where(a=>a.MENU\u MASTER.PARENT\u ID==p.MENU\u MASTER.OBJECT\u ID).Any()) {
    • @foreach(模型中的变量c,其中(g=>(g.MENU\u MASTER.PARENT\u ID==p.MENU\u MASTER.OBJECT\u ID))) { if(Model.Where(a=>a.MENU\u MASTER.PARENT\u ID==c.MENU\u MASTER.OBJECT\u ID).Any()) {
      • @foreach(Model.Where中的变量d(a=>a.MENU\u MASTER.PARENT\u ID==c.MENU\u MASTER.OBJECT\u ID)) {
      • }
    • } 其他的 {
    • } }
  • } 其他的 {
  • } }
控制器代码

 public ActionResult menu()
        {
            List<PartialClass> Q = new List<PartialClass>();
            var query = ctx.MENU_MASTER.Select(a => new { a.ACTION_NAME, a.CONTROLLER_NAME, a.OBJECT_ID, a.OBJECT_NAME, a.PARENT_ID });
            foreach (var item in query)
            {
                PartialClass cs = new PartialClass();
                cs.MENU_MASTER.ACTION_NAME = item.ACTION_NAME;
                cs.MENU_MASTER.CONTROLLER_NAME = item.CONTROLLER_NAME;
                cs.MENU_MASTER.OBJECT_ID = item.OBJECT_ID;
                cs.MENU_MASTER.OBJECT_NAME = item.OBJECT_NAME;
                cs.MENU_MASTER.PARENT_ID = item.PARENT_ID;
                Q.Add(cs);
            }

            return View(Q);
        }
公共操作结果菜单()
{
列表Q=新列表();
var query=ctx.MENU\u MASTER.Select(a=>new{a.ACTION\u NAME,a.CONTROLLER\u NAME,a.OBJECT\u ID,a.OBJECT\u NAME,a.PARENT\u ID});
foreach(查询中的var项)
{
PartialClass cs=新的PartialClass();
cs.MENU\u MASTER.ACTION\u NAME=item.ACTION\u NAME;
cs.MENU\u MASTER.CONTROLLER\u NAME=item.CONTROLLER\u NAME;
cs.MENU\u MASTER.OBJECT\u ID=item.OBJECT\u ID;
cs.MENU\u MASTER.OBJECT\u NAME=item.OBJECT\u NAME;
cs.MENU\u MASTER.PARENT\u ID=item.PARENT\u ID;
Q.Add(cs);
}
返回视图(Q);
}
模范班

public class MENU_MASTER
    {
        [Key]
        public decimal OBJECT_ID { get; set; }
        public string OBJECT_NAME { get; set; }
        public Nullable<decimal> OBJECT_TYPE { get; set; }
        [ForeignKey("MENU_GROUP")]
        public Nullable<decimal> GROUP_ID { get; set; }
        public string LINK_NAME { get; set; }
        public string IMAGE_PATH { get; set; }
        public Nullable<decimal> ORDER_OF_APEARANCE { get; set; }
        public Nullable<decimal> CREATED_BY { get; set; }
        public Nullable<System.DateTime> CREATED_ON { get; set; }
        public Nullable<decimal> MODIFIED_BY { get; set; }
        public Nullable<System.DateTime> MODIFIED_ON { get; set; }
        public string CONTROLLER_NAME { get; set; }
        public string ACTION_NAME { get; set; }
        [ForeignKey("MODULE_MASTER")]
        public Nullable<decimal> MODULE_ID { get; set; }
        public string DESCRIPTION { get; set; }
        public Nullable<decimal> PARENT_ID { get; set; }

        public virtual MENU_GROUP MENU_GROUP { get; set; }
        public virtual MODULE_MASTER MODULE_MASTER { get; set; }
    }
公共类菜单\u主菜单
{
[关键]
公共十进制对象_ID{get;set;}
公共字符串对象_NAME{get;set;}
公共可空对象_TYPE{get;set;}
[外键(“菜单组”)]
公共可空组_ID{get;set;}
公共字符串链接_NAME{get;set;}
公共字符串图像_路径{get;set;}
公共可空序{get;set;}
由{get;set;}创建的公共可空
在{get;set;}上创建了公共可为null的
由{get;set;}修改的公共可为null的_
{get;set;}上的公共可空修改_
公共字符串控制器_NAME{get;set;}
公共字符串操作\u名称{get;set;}
[外键(“模块主控”)]
公共可空模块_ID{get;set;}
公共字符串说明{get;set;}
公共可为空的父\u ID{get;set;}
公共虚拟菜单组菜单组{get;set;}
公共虚拟模块\主模块\主模块{get;set;}
}
这是通过上述答案得出的解决方案 谢谢大家

类别:TopMenu.cs 上下文:SigoContext.cs 布局:_Layout.cshtml
。。。
@{Html.RenderAction(“TopMenu”,“System”);}
@RenderBody()
...
部分视图:TopMenu.cshtml
@model IEnumerable
    @如果(型号!=null){ foreach(模型中的var项,其中(p=>p.Parent==0)){ if(Model.Where(s1=>s1.Parent==item.Id)!=null){
  • @项目.说明
      @foreach(Model.Where(s1=>s1.Parent==item.Id)中的var sub1){ if(Model.Where)(s2=>s2.Parent==su
          public class TopMenu {
              [Key]
              [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
              public int Id { get; set; }             //Iterator
              public int Parent { get; set; }         //TopMenuItem parent id
              public bool Group { get; set; }         //If this have another item below
              public string Descricao { get; set; }   //Text to show
              public string Action { get; set; }      //Action to Go
              public string Controller { get; set; }  //Controller to Go
          }
      
          public class SigoContext : DbContext {
              public SigoContext() : base("SigoMain") {}
                  public DbSet<TopMenu> TopMenu{ get; set; }
              }
          }
      
          public class SystemController : Controller {
              private SigoContext db = new SigoContext();
      
              [ChildActionOnly]
              public ActionResult TopMenu() {
                  return PartialView("TopBar",db.TopMenu);
              }
          }
      
      ...
      <body>
          @{Html.RenderAction("TopMenu", "System");}
          <div class="container body-content">
              @RenderBody()
      ...
      
      @model IEnumerable<SIGO.Models.TopMenu>
          <div class="navbar navbar-inverse navbar-fixed-top">
              <div class="container">
                  <div class="navbar-header">
                      <div class="SigoLogo">
                          <a href="@Url.Action("Index", "Home")" title="Início">
                              <img src="~/Content/images/Wlogo.png" />
                          </a>
                      </div>
                      <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse"></button>
                  </div>
                  <div class="navbar-collapse collapse">
                      <ul class="nav navbar-nav">
                          @if (Model != null){
                              foreach(var item in Model.Where(p => p.Parent == 0)) {
                                  if (Model.Where(s1 => s1.Parent == item.Id) != null) {
                                      <li>@item.Descricao
                                          <ul>
                                              @foreach (var sub1 in Model.Where(s1 => s1.Parent == item.Id)) {
                                                  if (Model.Where(s2 => s2.Parent == sub1.Id) != null) {
                                                      <li>@sub1.Descricao
                                                          <ul>
                                                              @foreach (var sub2 in Model.Where(s2 => s2.Parent == sub1.Id)) {
                                                              <li>@Html.ActionLink(sub2.Descricao,sub2.Action,sub2.Controller)</li>
                                                              }
                                                          </ul>
                                                      </li>
                                                  }else{
                                                      <li>@Html.ActionLink(sub1.Descricao,sub1.Action,sub1.Controller)</li>
                                                  }
                                              }
                                          </ul>
                                      </li>
                                  }else{
                                      <li>@Html.ActionLink(item.Descricao,item.Action,item.Controller)</li>
                                  }
                              }
                          }
                      </ul>
                  </div>
              </div>
          </div>