Генерация ссылки, содержащей фрагмент, с помощью ASP.Net MVC Routelink
-
21-09-2019 - |
Вопрос
Я пытаюсь использовать 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));
}
}