Генерация ссылки, содержащей фрагмент, с помощью ASP.Net MVC Routelink

StackOverflow https://stackoverflow.com/questions/2293148

Вопрос

Я пытаюсь использовать Html.RouteLink в представлении для создания ссылки на именованный якорь на другой странице.Существует несколько определений для RouteLink, которые включают опцию fragment, но я пытаюсь выяснить, есть ли другой способ.

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 должен уметь обращаться более элегантно.

Это было полезно?

Решение

Отредактировано с учетом правок основного поста

HTML.RouteLink( "Луга",
новый {Контроллер = "Cooga", действие = "Aooga" }, новый { Фрагмент = "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 Расселу.

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

Изменения, которые я внес:

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top