Генерация ссылки, содержащей фрагмент с ASP.Net MVC Routelink - PullRequest
1 голос
/ 19 февраля 2010

Я пытаюсь использовать 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 ]

2 голосов
/ 19 февраля 2010

Отредактировано с учетом основных правок сообщения

Html.RouteLink ( "Looga",
new {Controller = "Cooga", Action = "Aooga"}, новый {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")
0 голосов
/ 04 июня 2014

+ 1 к Расселу.

Вот слегка отредактированная версия его расширения, которую я изменил в соответствии с моими целями ... подумал, что опубликую его на случай, если это кому-нибудь поможет.

Изменения, которые я сделал:

  • Теперь он возвращает и строку Html, а не строку, чтобы вы могли использовать ее для отображения ссылки прямо на странице.

  • Я изменил его, чтобы принимать имя маршрута, а не объект значений маршрута

  • Я также изменил его так, что если фрагмент, который вы передаете, пуст, он не добавляет '#'

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)); } }

...