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

时间:2015-12-06 04:36:36

标签: c# model-view-controller controller asp.net-mvc-5

我几天前刚刚开始学习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());
    }

Index.cshtml:

Category: @Html.DropDownList("Categories1", "All")

这可以按预期工作 - 我得到一个漂亮的下拉框,只有我可见的类别。我知道这是有效的,因为用户导航到&#34;索引&#34;页面被路由到控制器到&#34;索引()&#34;获取模型和数据,然后将其传递给页面以构建HTML。

我很难理解的是如何从我的应用程序的不同部分获取控制器/模型的数据?第一个问题,控制器是否更多地依赖于模型或视图?

例如,如何在Home \ About.cshtml页面上放置上面的下拉框?我可以将上面相同的代码从我的Controller中输入&#34; public ActionResult About()&#34;在我的HomeController中,然后简单地将它放在About.cshtml页面上:

Category: @Html.DropDownList("Categories1", "All")

这样做有效,但我猜测由于重复代码,这不是正确的方法。

我最终尝试将下拉菜单添加到包含该类别列表的导航栏,但我不知道将代码放在何处。一旦我可以获得页面的类别名称/ ID列表,我就能很好地使用格式化。

谢谢,

2 个答案:

答案 0 :(得分:1)

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

这是一个关于这个主题的好教程〜&gt; https://stackoverflow.com/a/3832771/5590934

这也是一个很好的MVC4示例:http://mvc4ajaxdropdownlist.codeplex.com/

答案 1 :(得分:0)

谢谢大家,我想我已经掌握了MVC。您的帖子引导我使用此解决方案,以便将其发布给其他人。

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

[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);
}

然后我用我的分类视图创建了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>

最后,我将其添加到“_Layout.cshtml”,以便新菜单显示在所有页面上:

<ul class="nav navbar-nav">
    @Html.Action("Menu", "Categories", new { DropdownMenuTitle = "Categories" })
    ...