【问题标题】:Mvc3 implement custom action linkmvc3实现自定义动作链接
【发布时间】:2012-01-29 18:09:00
【问题描述】:

我有 .net mvc3 网站。我必须实施顶级菜单。每个菜单标签都会导致他的动作并显示另一个视图。这就是我现在所拥有的:

<ul id="menu">
        <li>@Html.ActionLink("Home", "Index", "Home")</li>
        <li>@Html.ActionLink("Products", "Products", "Home")</li>
        <li>@Html.ActionLink("Pricing", "Pricing", "Home")</li>
        <li>@Html.ActionLink("Our Team", "OurTeam", "Home")</li>
        <li>@Html.ActionLink("Contact Us", "ContactUs", "Home")</li>
</ul><!-- /menu -->

这个视图在我的布局中是Html.RenderAction("Header", "Home");(因为它必须出现在所有页面中) 我需要实现自定义 ActionLink。锚文本必须是:

<span>text</span><b>text</b>

“文本”是 Home(例如第一个 li) 并且当前的 ActionLink 必须将 class :"Selected" 添加到锚点。

我该怎么做?请帮忙

附言 我可以为我的网站中的每个视图添加此菜单,并使用当前视图的“选定”类,但这不是一个好的解决方案。

【问题讨论】:

    标签: asp.net-mvc-3


    【解决方案1】:

    如果我理解正确,您想将“选定”类放入当前显示操作。 您可以通过查看以下内容来检查视图:

    HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString()
    HttpContext.Current.Request.RequestContext.RouteData.Values["action"].ToString()
    

    然后你把“选定”类放到你的actionlink中,就像上一个答案中显示的那样

    <li>@Html.ActionLink("Home", "Index", "Home", null, new {@class = ":selected"})</li>
    

    我个人将创建一个 ViewModel,其中包含一个“MenuAction”列表,除了路由值之外,它还公开了一个布尔属性“Selected”。从视图来看,Imo 对数据的处理会更加干净。

    【讨论】:

    • 这是一个很好的解决方案。但我的菜单是部分视图,从布局中调用。所以 HttpContext.Current.Request.RequestContext.RouteData.Values["action"].ToString() 将始终返回此部分的名称,并且此名称永远不会与当前操作名称匹配..
    • 调用类似@Html.Action("MainMenu", "Menu") 的东西。比你做逻辑并在控制器中准备视图
    • 我的错误是我使用了 var currentAction = htmlHelper.ViewContext.RouteData.GetRequiredString("action") 而不是 HttpContext.Current.Request.RequestContext.RouteData.Values["action"].ToString()。现在是工作。谢谢
    • 你知道如何自定义锚 html : texttext 吗?
    • 您可以编写自己的html扩展。 public static MvcHtmlString MySpan(this HtmlHelper html, string myText)
    【解决方案2】:

    您可以使用此ActionLink 重载添加class

    <li>@Html.ActionLink("Home", "Index", "Home", null, new {@class = ":selected"})</li>
    

    第5个参数是HTML属性。

    MSDN此重载的ActionLink


    更新:

    $(function(){
        var controllerName ='ViewContext.RouteData.Values["Controller"]';
        $('#' +controllerName).addClass(':selected');
    });
    

    【讨论】:

    • 您将静态“选定”类添加到主页链接。我需要将“选定”动态添加到当前 ActionLink
    • @user1086344。什么时候添加?
    • 例如,当您单击“产品”时,页面将加载“产品”视图,并且“选定”类必须添加到“产品”锚点并从之前的锚点中删除。
    • @user1086344。我会给每个&lt;a&gt; 一个id 并给它:selectedjquery$('#Product').addClass(':selected'); 你可以添加一个脚本来获取控制器并将:selected&lt;a&gt; 与匹配控制器的ID名字。
    • @user1086344。服务端有什么问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-09
    相关资源
    最近更新 更多