html助手。 ActionLink 总是设置当前控制器而不是传递另一个控制器

Posted

技术标签:

【中文标题】html助手。 ActionLink 总是设置当前控制器而不是传递另一个控制器【英文标题】:HtmlHelper. ActionLink always set the current controller instead passing another controller 【发布时间】:2020-10-11 09:35:51 【问题描述】:

我正在使用 htmlHelper 类,其中我使用了一些代码,并将其设置为我的布局导航栏作为菜单。

下面是相同的代码:

 public static MvcHtmlString MenuLink(this HtmlHelper helper,string text, string action, string controller)
        
            var routeData = helper.ViewContext.RouteData.Values;
            var currentController = routeData["controller"];
            var currentAction = routeData["action"];

            if (String.Equals(controller, currentController as string, StringComparison.OrdinalIgnoreCase))
            
                return new MvcHtmlString("<li class=\"nav-item active\">" + helper.ActionLink(text, action, controller, new  @class="nav-link" ) + "</li>");
            
            return new MvcHtmlString("<li class=\"nav-item\">" + helper.ActionLink(text, action, controller, new  @class = "nav-link" ) + "</li>");
        

我在布局页面中设置了如下菜单:

 @Html.MenuLink("Search", "Search", "Home")

现在,当我运行应用程序时,它首先加载登录页面,其中登录路径为:帐户/登录

现在在搜索菜单中,当我悬停此菜单时,我发现此菜单 url 也设置为 Account/Search?Length=4。

但我为这个菜单传递了“主页”控制器。

我调试了 html 帮助类代码,发现它设置了正确的操作和控制器,这是从布局传递的。

不知道这个网址是在哪里改的。

请提出建议。

【问题讨论】:

【参考方案1】:

使用以下代码:

 public static MvcHtmlString MenuLink(this HtmlHelper helper,string text, string action, string controller)
        
            var routeData = helper.ViewContext.RouteData.Values;
            var currentController = routeData["controller"];
            var currentAction = routeData["action"];

            if (String.Equals(controller, currentController as string, StringComparison.OrdinalIgnoreCase))
            
                return new MvcHtmlString("<li class=\"nav-item active\">" + helper.ActionLink(text, action, controller,null, new  @class="nav-link" ) + "</li>");
            
            return new MvcHtmlString("<li class=\"nav-item\">" + helper.ActionLink(text, action, controller,null, new  @class = "nav-link" ) + "</li>");
        

当你使用

helper.ActionLink(text, action, controller,new  @class="nav-link" )

然后它指的是当前控制器,因为您没有指定 routeValue 所以,当您想从一个控制器重定向到另一个控制器时,如果没有重定向方法的 routevalue,则将 routevalue 指定为 null。

所以,请使用helper.ActionLink(text, action, controller,null, new @class="nav-link" )

【讨论】:

你是对的,你建议的代码对我有用。谢谢。

以上是关于html助手。 ActionLink 总是设置当前控制器而不是传递另一个控制器的主要内容,如果未能解决你的问题,请参考以下文章

@html.ActionLink的几种参数格式

转@html.ActionLink的几种参数格式

在 Mvc 中使用 Html.ActionLink 时如何绕过 HTML 编码?

MVC ActionLink 从当前 url 添加所有(可选)参数

如何动态覆盖 Html.ActionLink 生成的 URL?

Html.ActionLink , Url.Action