创建用于导航的ViewModel

Eri*_*ard 2 navigation partial-views viewmodel asp.net-mvc-4

我有一个MVC 4应用程序,有几个视图.即产品,食谱,Distrubutors和商店.

每个视图都基于一个模型.

让我们保持简单,并说我所有的控制器都传递类似的视图模型,看起来像我的产品操作:

public ActionResult Index()
{
    return View(db.Ingredients.ToList());
}
Run Code Online (Sandbox Code Playgroud)

好的,这很好,没问题.但是现在我的所有页面都工作了,我想改变我的导航(每个视图有下拉列表)来加载该模型中的项目.

所以我会有4个按钮(产品,食谱,分配器和商店)的导航.

当您翻转每个按钮(假设我们滚动产品按钮)时,下拉列表会列出产品.

要做到这一点,我需要创建一些类型的ViewModel,其中包含所有这四个模型.显然,我不能为每个导航元素剪切出PartialView并使用

@model IEnumerable<GranSabanaUS.Models.Products>
Run Code Online (Sandbox Code Playgroud)

并为该下拉列表重复产品,因为那时导航只能在产品视图中使用,而不能在其他任何地方使用.

(After the solution) AND YES ROWAN你在我创建的导航类型中是正确的,请看这里: 导航我正在创建

Row*_*man 11

介绍

我将做一些假设,因为我没有所有的信息.

我怀疑你想要创建这样的东西:

下拉式菜单

分开观点

当您遇到"如何将所有内容放入单个控制器/视图模型"的问题时,它可能会执行太多操作并需要进行分割.

不要将最后一页视为一个大视图 - 将视图划分为较小的视图,以便它们做"一件事".

例如,导航只是布局的一部分.您可以更进一步地说每个下拉菜单都是导航的一部分,依此类推.

导航概述

假设你有一个_Layout.cshtml如下所示:

<body>
    <div class="navbar">
        <ul class="nav">
            <li><a href="#">Products</a></li>
            <li><a href="#">Recipes</a></li>
        </ul>
    </div>

    @RenderBody()
</body>
Run Code Online (Sandbox Code Playgroud)

如您所见,我们有一个简单的导航系统,然后渲染主体.我们面临的问题是:我们如何提取此导航并为其提供渲染所有内容所需的模型?

提取导航

让我们将导航提取到它自己的视图中.抓取导航HTML并将其粘贴到名为__Navigation.cshtml_的新视图中并将其放在下面~/Views/Partials.

_Navigation.cshtml

<div class="navbar">
    <ul class="nav">
        <li><a href="#">Products</a></li>
        <li><a href="#">Recipes</a></li>
    </ul>
</div>
Run Code Online (Sandbox Code Playgroud)

创建一个名为PartialsController的新控制器.创建一个新动作来调用我们的导航.

PartialsController.cs

[ChildActionOnly]
public class PartialsController : Controller
{
    public ActionResult Navigation()
    {
        return PartialView("_Navigation");
    }

}
Run Code Online (Sandbox Code Playgroud)

更新我们的布局以调用导航.

_Layout.cshtml

<body>
    @Html.Action("Navigation", "Partials")

    @RenderBody()
</body>
Run Code Online (Sandbox Code Playgroud)

现在我们的导航被分成了自己的局部视图.它更加独立和模块化,现在可以更轻松地为其提供模型数据.

注入模型数据

假设我们有一些模型,比如你提到的模型.

public class Product { //... }
public class Recipe { //... }
Run Code Online (Sandbox Code Playgroud)

让我们创建一个视图模型:

NavigationViewModel.cs

public class NavigationViewModel
{
    public IEnumerable<Product> Products { get; set; }
    public IEnumerable<Recipe> Recipes { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

让我们来解决我们的行动:

PartialsController.cs

public ActionResult Navigation()
{
    NavigationViewModel viewModel;

    viewModel = new NavigationViewModel();
    viewModel.Products = db.Products;
    viewModel.Recipes = db.Recipes;

    return PartialView("_Navigation", viewModel);
}
Run Code Online (Sandbox Code Playgroud)

最后,更新我们的观点:

_Navigation.cshtml

@model NavigationViewModel

<div class="navbar">
    <ul class="nav">

        @foreach (Product product in Model.Products)
        {
            @<li>product.Name</li>
        }

        @foreach (Recipe recipe in Model.Recipes)
        {
            @<li>recipe.Name</li>
        }
    </ul>
</div>
Run Code Online (Sandbox Code Playgroud)

  • 该死的.我非常感谢你的帮助和Scotties.我从你的两段代码中拿走了很多东西.这回答了我的问题,除此之外,你花时间向像我这样需要解释的人解释.我再次感谢你们两位!让我为此咀嚼一些,我可能有一个问题,但我对此表示怀疑. (2认同)