asp.net mvc - MVC5 utilizando MvcSiteMapProvider para compilar el menú de arranque de twitter
asp.net-mvc twitter-bootstrap (2)
La sección de menú predeterminada en la plantilla MVC5 se ve así:
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li>@Html.ActionLink("Home", "Index", "Home")</li>
<li>@Html.ActionLink("About", "About", "Home")</li>
<li>@Html.ActionLink("Contact", "Contact", "Home")</li>
</ul>
@Html.Partial("_LoginPartial")
</div>
_LoginPartial se ve así:
@using Microsoft.AspNet.Identity
@if (Request.IsAuthenticated)
{
using (Html.BeginForm("LogOff", "Account", FormMethod.Post, new { id = "logoutForm", @class = "navbar-right" }))
{
@Html.AntiForgeryToken()
<ul class="nav navbar-nav navbar-right">
<li>
@Html.ActionLink("Hello " + User.Identity.GetUserName() + "!", "Manage", "Account", routeValues: null, htmlAttributes: new { title = "Manage" })
</li>
<li><a href="javascript:document.getElementById(''logoutForm'').submit()">Log off</a></li>
</ul>
}
}
else
{
<ul class="nav navbar-nav navbar-right">
<li>@Html.ActionLink("Register", "Register", "Account", routeValues: null, htmlAttributes: new { id = "registerLink" })</li>
<li>@Html.ActionLink("Log in", "Login", "Account", routeValues: null, htmlAttributes: new { id = "loginLink" })</li>
</ul>
}
Entonces puedo reemplazar el código
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li>@Html.ActionLink("Home", "Index", "Home")</li>
<li>@Html.ActionLink("About", "About", "Home")</li>
<li>@Html.ActionLink("Contact", "Contact", "Home")</li>
</ul>
</div>
con solo una línea
@Html.MvcSiteMap().Menu(false)
Esa línea producirá esto:
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li>@Html.ActionLink("Home", "Index", "Home")</li>
<li>@Html.ActionLink("About", "About", "Home")</li>
<li>@Html.ActionLink("Contact", "Contact", "Home")</li>
</ul>
//how to put _LoginPartial here!
</div>
Entonces la pregunta es ¿cómo puedo renderizar @Html.Partial("_LoginPartial")
dentro del menú creado por MvcSiteMapProvider
?
Si recuerdo correctamente, puede especificar DisplayTemplate en el método de Menu()
.
Navegue a ~ / Views / Shared / DisplayTemplates y cree una nueva vista llamada MyMenu.cshtml .
Establezca el tipo de modelo en MvcSiteMapProvider.Web.Html.Models.MenuHelperModel
y luego especifique la estructura del menú (con HTML).
MyMenu.cshtml
@model MvcSiteMapProvider.Web.Html.Models.MenuHelperModel
@using MvcSiteMapProvider.Web.Html.Models
<ul class="nav navbar-nav navbar-right">
@foreach (var node in Model.Nodes) {
<li>@Html.DisplayFor(m => node)</li>
}
</ul>
Ahora cambie su método de Menu()
.
@Html.MvcSiteMap().Menu("MyMenu")
La respuesta de Rowan es bastante cercana a lo que necesita hacer, y debería haberlo guiado por el camino correcto. La plantilla MyMenu.cshtml puede contener cualquier lógica que necesite para generar el HTML deseado. Simplemente necesita modificar la plantilla para cumplir con sus requisitos. Tenga en cuenta que también puede modificar las plantillas predeterminadas si lo desea, pero deberá tener cuidado de seleccionar "no" cuando se le solicite que las reemplace durante una actualización de MvcSiteMapProvider, o se sobrescribirán sus personalizaciones.
@model MvcSiteMapProvider.Web.Html.Models.MenuHelperModel
@using MvcSiteMapProvider.Web.Html.Models
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
@foreach (var node in Model.Nodes) {
<li>@Html.DisplayFor(m => node)</li>
}
</ul>
@Html.Partial("_LoginPartial")
</div>
Y luego esta línea producirá el resultado deseado:
@Html.MvcSiteMap().Menu("MyMenu")