如何在MVC 4中为一个控制器实现面包屑,但链接多个操作

时间:2014-01-29 16:51:55

标签: asp.net-mvc-4 razor breadcrumbs

所以我有非常简单的代码结构我只有一个控制器(不包括登录和基本控制器) - Home控制器和我调用的所有操作都来自那里。我必须实现一个面包屑,因为它只有一个控制器我决定不使用像mvcsitemapprovider之类的东西或其他类似的东西,而是坚持像我现在拥有的那样简单的东西:

 @if(ViewContext.RouteData.Values["action"] != "Index")
        {
            <div class="top-header-links">
                @Html.ActionLink(ViewContext.RouteData.Values["action"].ToString(), ViewContext.RouteData.Values["action"].ToString(), ViewContext.RouteData.Values["controller"].ToString()) 
            </div>
        }
        <div class="top-header-links">
            @Html.ActionLink("Home", "Index", "Home")
        </div>

实际上并不多,但我很满意。但是现在我发现有一些特定情况,例如Home/NewsHome/ShortNews这些都是我的Home控制器中的操作,因此可以说它们处于同一级别,但仍然是逻辑连接是ShortNews是更一般的News的节点所以在我的面包屑中我最终想要>Home>News>ShortNews但是现在它实现的方式显然不会发生。

所以我现在可以想到的是使用ViewBag.SecondAction或其他东西并将其填充到我知道从另一个操作中调用的那些操作中,并在我的_Layout页面中再添加一个if (ViewBag.SecondAction != null)然后添加我想要的内容。现在这可以完成这项工作但是我认为它似乎不具备可扩展性,如果项目增长,我认为这很难维护(并且可能没有效率,因为可能有比现在更多的条件) 。所以我仍然在寻找一些标准的解决方案,按标准来说,我的意思是如果我不必安装第三方软件并且只是自己编写代码我会很高兴但是我希望它更通用一些,至少要处理我所描述的这种情况。

由于我看到的大多数建议只是使用mvcsitemapprovider我想知道我是否可以修改我的代码以便获得所需的结果,如果我只想再包含一个动作,那么就很容易这样做的方式,至少比使用mvcsitemapprovider更容易吗?

1 个答案:

答案 0 :(得分:3)

尝试这样的事情

<div class="breadcrumb">
@{
    @Html.ActionLink("Home", "Index", "HomeController")

    if (Html.IsCurrentAction("News", "HomeController"))
    {
        @:> News
    }

    if (Html.IsCurrentAction("ShortNews", "HomeController"))
    {
        @:> @Html.ActionLink("News", "News", "HomeController")
        @:> Short News
    }

我使用Html辅助方法来确定它是否是当前操作。我的更深入,不仅检查路线值,还检查字符串参数,它不是防弹,但你可以为你的目的扩展它。

 public static bool IsCurrentAction(this HtmlHelper helper, string actionName,
     string controllerName)
 {
     var routeValues = new RouteValueDictionary(helper.ViewContext.RouteData.Values);
     //use this to then check if its current action/controller