更新控制器中的局部视图
Update partial view in controller
我正在使用 asp.net MVC5 开发一个新项目。在这个项目中,我有无限的类别和无限的子类别。
我想将我的类别 + 子类别转换为菜单。我知道我可以在我的基本控制器上创建这些菜单,但我不喜欢总是呈现类别。
我决定创建一个像 _MenuPartial.cshtml 这样的局部视图,并在用户创建新类别或更新时生成菜单,最后一步,我在我的布局中呈现这个局部视图。
我找不到适合这种情况的任何资源。
我可以在控制器中将字符串转换为部分视图吗?或者我是否必须创建一个 txt 文件并将我的菜单保存在那里并每次将其转换为 HTML?
对于这种情况,我建议你创建一个渲染菜单的动作。然后你可以在任何你想要渲染的地方使用它。例如在你的 Home.cshml
你的动作控制器应该是这样的:
public PartialViewResult MainMenu()
{
List<YourApp.Models.Menu> menuItems = new List<YourApp.Models.Menu>();
/* Add your menus item here */
menuItems.Add(
new YourApp.Models.Menu() {
Title = "Level 1",
SubItems = new List<YourApp.Models.Menu>() {
new YourApp.Models.Menu() {
Title = "Level 2",
SubItems = new List<YourApp.Models.Menu>() {
new YourApp.Models.Menu() {
Title = "Level 3",
Url = Url.Action("SampleAction", "SampleController")
}
}
}
}
}
);
return PartialView("~/Views/Shared/MainMenu", menuItems);
}
下面是使用 bootstrap 框架制作菜单的 MainMenu.cshtml
视图示例:
@model YourApp.Models.Menu;
<div class="navbar-collapse collapse navbar-right">
<ul class="nav navbar-nav" style="font-weight:bold;">
@* Create a for loop on first level of menu model *@
@foreach(var firstLevel in Model){
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">@(firstLevel.Title)
<b class="caret"></b>
</a>
<ul class="dropdown-menu">
@* Iterate on children of first level items *@
@foreach(var secondLevel in firstLevel.SubItems){
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">@(secondLevel.Title)
<b class="caret"></b>
</a>
<ul class="dropdown-menu">
@foreach(var thirdLevel in secondLevel.SubItems){
<li><a href="@(thirdLevel.Url)">@(thirdLevel.Title)</a></li>
}
</ul>
</li>
}
</ul>
</li>
}
</ul>
</div>
您可以调用此代码并在您的视图中呈现 MainMenu.cshtml
(例如 Home.cshtml
或 Index.cshtml
):
@Html.Action("MainMenu", "Home")
我正在使用 asp.net MVC5 开发一个新项目。在这个项目中,我有无限的类别和无限的子类别。
我想将我的类别 + 子类别转换为菜单。我知道我可以在我的基本控制器上创建这些菜单,但我不喜欢总是呈现类别。
我决定创建一个像 _MenuPartial.cshtml 这样的局部视图,并在用户创建新类别或更新时生成菜单,最后一步,我在我的布局中呈现这个局部视图。
我找不到适合这种情况的任何资源。
我可以在控制器中将字符串转换为部分视图吗?或者我是否必须创建一个 txt 文件并将我的菜单保存在那里并每次将其转换为 HTML?
对于这种情况,我建议你创建一个渲染菜单的动作。然后你可以在任何你想要渲染的地方使用它。例如在你的 Home.cshml
你的动作控制器应该是这样的:
public PartialViewResult MainMenu()
{
List<YourApp.Models.Menu> menuItems = new List<YourApp.Models.Menu>();
/* Add your menus item here */
menuItems.Add(
new YourApp.Models.Menu() {
Title = "Level 1",
SubItems = new List<YourApp.Models.Menu>() {
new YourApp.Models.Menu() {
Title = "Level 2",
SubItems = new List<YourApp.Models.Menu>() {
new YourApp.Models.Menu() {
Title = "Level 3",
Url = Url.Action("SampleAction", "SampleController")
}
}
}
}
}
);
return PartialView("~/Views/Shared/MainMenu", menuItems);
}
下面是使用 bootstrap 框架制作菜单的 MainMenu.cshtml
视图示例:
@model YourApp.Models.Menu;
<div class="navbar-collapse collapse navbar-right">
<ul class="nav navbar-nav" style="font-weight:bold;">
@* Create a for loop on first level of menu model *@
@foreach(var firstLevel in Model){
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">@(firstLevel.Title)
<b class="caret"></b>
</a>
<ul class="dropdown-menu">
@* Iterate on children of first level items *@
@foreach(var secondLevel in firstLevel.SubItems){
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">@(secondLevel.Title)
<b class="caret"></b>
</a>
<ul class="dropdown-menu">
@foreach(var thirdLevel in secondLevel.SubItems){
<li><a href="@(thirdLevel.Url)">@(thirdLevel.Title)</a></li>
}
</ul>
</li>
}
</ul>
</li>
}
</ul>
</div>
您可以调用此代码并在您的视图中呈现 MainMenu.cshtml
(例如 Home.cshtml
或 Index.cshtml
):
@Html.Action("MainMenu", "Home")