使用ASP.Net MVC Routelink生成包含片段的链接

时间:2010-02-18 23:56:07

标签: asp.net-mvc url fragment-identifier routelink

我正在尝试在视图中使用Html.RouteLink来生成指向另一个页面上的命名锚点的链接。 RouteLink的一些定义包括片段选项,但我试图弄清楚是否有另一种方式。

public static string RouteLink(
    this HtmlHelper htmlHelper,
    string linkText,
    string routeName,
    string protocol,
    string hostName,
    string fragment,
    Object routeValues,
    Object htmlAttributes
)

是明显的解决方案,但有点笨重似乎。我宁愿做一些像

这样的事情
Html.RouteLink("Looga", new { Controller = "Cooga", Action = "Aooga", Fragment = "Fooga" })

并返回

<a href="/Cooga/Aooga#Fooga">Looga</a>

这是可能的还是我需要指定URL的每个小部分以使用内置帮助程序获取片段。我也可以像

一样手动完成
<a href="<%= Url.RouteUrl(new { Controller = "Cooga", Action = "Aooga" }) %>#Fooga>Looga</a>

但似乎RouteLink应该能够更优雅地处理。

2 个答案:

答案 0 :(得分:2)

已编辑以考虑主要帖子编辑

<德尔>     Html.RouteLink(         “Looga”,
        new {Controller =“Cooga”,Action =“Aooga”},         new {Fragment =“Fooga”})

此代码将产生当前

<a href="/Cooga/Aooga" Fragment="Fooga">Looga</a>

不是你想要的。相反,你可以为RouteLink编写自己的扩展方法,就像这样......

public static class RouteLinkExtensions
{
    public static string RouteLink( 
        this HtmlHelper htmlHelper, 
        string linkText, 
        object routeValues, 
        string fragment)
    {
        // There's probably better ways to do the implementation, but you get the idea
        var url = new UrlHelper(htmlHelper.ViewContext.RequestContext);
        return string.Format("<a href=\"{0}#{1}>{2}</a>",
                                url.RouteUrl(routeValues), 
                                fragment,
                                linkText); 
    }
}

这将允许您在页面中使用对RouteLink的干净调用: - )

Html.RouteLink( 
    "Looga",  
    new { Controller = "Cooga", Action = "Aooga" }, 
    "Fooga")

答案 1 :(得分:0)

+1罗素。

这是他的扩展程序的略微编辑版本,我根据自己的目的进行了更改...我想发布它以防万一。

我所做的改变:

  • 它现在返回和Html字符串而不是字符串,以便您可以使用它直接将链接呈现到页面中。

  • 我将其更改为接受路由名称而不是路由值对象

  • 我也对其进行了更改,以便如果您传入的片段为空,则不会附加&#39;#&#39;

public static class HtmlHelperRouteLinkExtension { public static IHtmlString RouteLink( this HtmlHelper htmlHelper, string linkText, string routeName, string fragment) { var url = new UrlHelper(htmlHelper.ViewContext.RequestContext); return htmlHelper.Raw(string.Format("<a href=\"{0}{1}\">{2}</a>", url.RouteUrl(routeName), String.IsNullOrWhiteSpace(fragment) ? "" : "#" + fragment, linkText)); } }