将HREF转换为RouteLink

时间:2012-01-15 07:24:45

标签: asp.net-mvc asp.net-mvc-3 model-view-controller

这似乎很简单,但我无法得到任何工作。此代码由我的模板生成器生成,需要更改。

<li><a href="../Home/Contact" class="active"><span class="l"></span><span class="r">
                        </span><span class="t">Nous contacter</span></a> </li>

到目前为止,我最好的选择是:

    <li><span class="l"></span><span class="r"></span>
@Html.RouteLink("Contact", new { Controller = "Home", Action = "Contact" }, new { @class = "t" })</li>

但它没有做任何事情。 只是为了说明我的问题很明确:链接适用于两种情况,这很好。格式化不起作用。这是我的问题。

2 个答案:

答案 0 :(得分:3)

第二个将生成:

<li>
    <span class="l"></span>
    <span class="r"></span>
    <a class="t" href="/Home/Contact">Contact</a>
</li>

这与您在第一时可能解释格式问题的内容不同:

<li>
    <a href="../Home/Contact" class="active">
        <span class="l"></span>
        <span class="r"></span>
        <span class="t">Nous contacter</span>
    </a>
</li>

Html帮助程序(如Html.ActionLink和RouteLink)的问题在于它们始终通过Html对文本进行编码,因此您无法将HTML用作文本。所以有一种可能性如下:

<li>
    <a href="@Url.RouteUrl("Contact", new { controller = "home", action = "contact" })" class="active">
        <span class="l"></span>
        <span class="r"></span>
        <span class="t">Nous contacter</span>
    </a>
</li>

另一种可能性,如果你有很多生成的是编写一个自定义的Html助手,它将为你完成这项工作:

public static class HtmlExtensions
{
    public static IHtmlString MyLink(
        this HtmlHelper htmlHelper, 
        string linkText, 
        string routeName, 
        object routeValues
    )
    {
        var spans = string.Format(
            "<span class=\"l\"></span><span class=\"r\"></span><span class=\"t\">{0}</span>", 
            htmlHelper.Encode(linkText)
        );

        var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext);
        var url = urlHelper.RouteUrl(routeName, routeValues);
        var anchor = new TagBuilder("a");
        var rvd = new RouteValueDictionary(routeValues);
        var rd = htmlHelper.ViewContext.RouteData;
        var currentAction = rd.GetRequiredString("action");
        var currentController = rd.GetRequiredString("controller");
        var controller = rvd["controller"] as string;
        var action = rvd["action"] as string;
        if (string.Equals(controller, currentController, StringComparison.OrdinalIgnoreCase) &&
            string.Equals(action, currentAction, StringComparison.OrdinalIgnoreCase))
        {
            anchor.AddCssClass("active");
        }
        anchor.Attributes["href"] = url;
        anchor.InnerHtml = spans;
        return new HtmlString(anchor.ToString());
    }
}

然后:

<li>
    @Html.MyLink("Nous contacter", "Contact", new { controller = "home", action = "contact" })
</li>

答案 1 :(得分:-1)

只需使用以下内容:

@Url.Action("Index", "Home")