C# MVC 5-向所有页面添加导航下拉列表

C# MVC 5-向所有页面添加导航下拉列表,c#,model-view-controller,controller,asp.net-mvc-5,C#,Model View Controller,Controller,Asp.net Mvc 5,几天前我刚刚开始学习MVC,我开始学习MVC的概念,但我在另一个页面上尝试获得一个下拉菜单时有些困难。我有一个类别列表,可以在categories\Index.cshtml页面上创建一个下拉框。我有以下资料: 型号: public class Category { public int Id { get; set; } [Required] [StringLength(100, MinimumLength = 3)] public string Name { g

几天前我刚刚开始学习MVC,我开始学习MVC的概念,但我在另一个页面上尝试获得一个下拉菜单时有些困难。我有一个类别列表,可以在categories\Index.cshtml页面上创建一个下拉框。我有以下资料:

型号:

public class Category
{
    public int Id { get; set; }

    [Required]
    [StringLength(100, MinimumLength = 3)]
    public string Name { get; set; }

    [Required]
    public Boolean Visible { get; set; }

    public Category()
    {
        this.Visible = true;
    }
}
控制器:

private DefaultConnection db = new DefaultConnection();

    // GET: Categories
    public ActionResult Index()
    {          
        var CategoryLst = new List<string>();
        var CategoryQry = from c in db.Categories
                          orderby c.Name
                          where c.Visible == true
                          select c.Name;

        CategoryLst.AddRange(CategoryQry.Distinct());
        ViewBag.Categories1 = new SelectList(CategoryLst);

        return View(db.Categories.ToList());
    }
[ChildActionOnly]
[AllowAnonymous]
public ActionResult Menu(string dropdownMenuTitle)
{
    ViewBag.DropdownMenuTitle = dropdownMenuTitle;

    var categoriesQuery = from d in db.Categories
                          orderby d.Name
                          where d.Visible == true
                          select d;
    return PartialView(categoriesQuery);
}
这就像预期的一样——我得到了一个很好的下拉框,里面有我的可见类别。我理解这是因为用户导航到“Index”页面,该页面被路由到控制器“Index()”,该控制器获取模型和数据,然后将其传递到页面以构建HTML

我很难理解的是,如何从应用程序的不同部分从控制器/模型获取数据?第一个问题,控制器是与模型还是与视图联系更紧密

例如,如何将上面的下拉框放在我的主页\About.cshtml页面上?我可以将上面相同的代码从我的控制器放到我的HomeController中的“public ActionResult About()”中,然后简单地将其放在About.cshtml页面上:

Category: @Html.DropDownList("Categories1", "All")
这是可行的,但我猜这不是正确的方法,因为重复了代码

我最终尝试添加一个下拉菜单到我的导航栏,其中包含该类别列表,但我不知道把代码放在哪里。一旦我可以将类别名称/id列表添加到页面中,我就可以很好地进行格式设置


谢谢,

我的建议是将您的导航添加到项目下共享文件夹中的_Layout.cshtml页面中,然后它在整个应用程序中都是通用的

这是一个关于这个主题的好教程~>


这里还有一个很好的MVC4示例:

谢谢大家,我想我已经掌握了MVC的窍门。您的帖子让我找到了此解决方案,因此将其发布给其他人

我将此添加到我的类别控制器:

private DefaultConnection db = new DefaultConnection();

    // GET: Categories
    public ActionResult Index()
    {          
        var CategoryLst = new List<string>();
        var CategoryQry = from c in db.Categories
                          orderby c.Name
                          where c.Visible == true
                          select c.Name;

        CategoryLst.AddRange(CategoryQry.Distinct());
        ViewBag.Categories1 = new SelectList(CategoryLst);

        return View(db.Categories.ToList());
    }
[ChildActionOnly]
[AllowAnonymous]
public ActionResult Menu(string dropdownMenuTitle)
{
    ViewBag.DropdownMenuTitle = dropdownMenuTitle;

    var categoriesQuery = from d in db.Categories
                          orderby d.Name
                          where d.Visible == true
                          select d;
    return PartialView(categoriesQuery);
}
然后,我在我的Categories视图中创建了Menu.cshtml,如下所示:

@model IEnumerable<App.Models.Category>

<li class="dropdown">
    <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">@ViewBag.DropdownMenuTitle <span class="caret"></span></a>
    <ul class="dropdown-menu">
        @foreach (var item in Model)
        {
            <li>@Html.ActionLink(item.Name, item.Name, "Items")</li>
        }
        <li role="separator" class="divider"></li>
        <li>@Html.ActionLink("All", "Feed", "Items")</li>
    </ul>
</li>
@model IEnumerable
    @foreach(模型中的var项目) {
  • @ActionLink(item.Name,item.Name,“Items”)
  • }
  • @ActionLink(“全部”、“提要”、“项目”)
最后,我将其添加到“_Layout.cshtml”中,以便新菜单显示在所有页面上:

<ul class="nav navbar-nav">
    @Html.Action("Menu", "Categories", new { DropdownMenuTitle = "Categories" })
    ...
    @Action(“菜单”、“类别”,新建{DropdownMenuTitle=“Categories”}) ...
创建一个
[ChildActionOnly]
方法,(比如)
public ActionResult Menu()
,该方法返回下拉列表(以及任何其他常用菜单项)的部分视图,并在视图或布局中使用
@Html.Action()
呈现Html。