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)
| 归档时间: |
|
| 查看次数: |
3849 次 |
| 最近记录: |