2010-02-18 3 views
1

Я пытаюсь использовать Html.RouteLink в представлении для создания ссылки на именованный якорь на другой странице. Есть несколько определений для RouteLink, которые включают опцию фрагмента, но я пытаюсь выяснить, есть ли другой способ.Создание ссылки, содержащей фрагмент с ASP.Net MVC 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 должен быть в состоянии обрабатывать более элегантно.

+0

Необходимо определить протокол и имя хоста, чтобы я мог добавить фрагмент, кажется глупым. Я надеялся, что есть лучший способ. – Tivac

ответ

2

Edited учитывать главный пост редактирует

Html.RouteLink ( "Looga",
новый {Controller = "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") 
+0

Скорее всего, я закончу.Извините за примерный пример, я не уделял достаточного внимания. Исправлено. – Tivac

0

+1 к Расселу.

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

изменение я сделал:

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

  • Я изменил его, чтобы принять название маршрута, а не объект а 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)); } }