Конвертировать HREF в RouteLink - PullRequest
0 голосов
/ 15 января 2012

Кажется, все просто, но я ничего не могу заставить работать.Этот код был сгенерирован моим генератором шаблонов и должен быть изменен.

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

3 голосов
/ 15 января 2012

Второй сгенерирует:

<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>
0 голосов
/ 15 января 2012

Просто используйте что-то вроде этого:

@Url.Action("Index", "Home")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...