2

MVC5 模板中的默认菜单部分如下所示:

     <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 看起来像这样:

@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>
}

所以我可以替换代码

        <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>

只有一行:

@Html.MvcSiteMap().Menu(false)

那条线将产生这个:

        <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>

所以问题是我如何@Html.Partial("_LoginPartial")在由创建的菜单中呈现MvcSiteMapProvider

4

2 回答 2

3

罗文的答案非常接近您需要做的事情,并且应该引导您走上正确的道路。MyMenu.cshtml模板可以包含输出所需 HTML 所需的任何逻辑。您只需修改模板以满足您的要求。请注意,如果需要,您还可以修改默认模板,但在升级 MvcSiteMapProvider 期间要求替换它们时,您必须小心选择“否”,否则您的自定义将被覆盖。

@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>

然后这一行将产生所需的输出:

@Html.MvcSiteMap().Menu("MyMenu")
于 2013-11-04T15:13:42.540 回答
1

如果我没记错的话,您可以在Menu()方法中指定 DisplayTemplate。

导航到 ~/Views/Shared/DisplayTemplates 并创建一个名为MyMenu.cshtml的新视图。

将模型类型设置为MvcSiteMapProvider.Web.Html.Models.MenuHelperModel,然后指定菜单结构(使用 HTML)。

我的菜单.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>

现在改变你的Menu()方法。

@Html.MvcSiteMap().Menu("MyMenu")
于 2013-11-03T23:56:44.510 回答