【问题标题】:Convert HREF to RouteLink将 HREF 转换为 RouteLink
【发布时间】:2012-01-15 07:24:45
【问题描述】:

这似乎很简单,但我什么也做不了。此代码由我的模板生成器生成,需要更改。

<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>

但它什么也没做。 只是为了让我的问题很清楚:该链接在两种情况下都有效,这很好。格式化不起作用。这是我的问题。

【问题讨论】:

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


    【解决方案1】:

    第二个会生成:

    <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>
    

    【讨论】:

    • 像魅力一样工作。这是一个完整而详尽的解决方案。谢谢一百万!
    【解决方案2】:

    只要使用这样的东西:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-21
      • 2017-06-13
      • 2021-03-27
      • 2023-04-04
      • 1970-01-01
      • 2014-08-30
      相关资源
      最近更新 更多