Asp net html actionlink

Often you need to put links in your ASP.NET MVC Core Views that take users to other controllers in your web app – like navigating to a details page for a particular record in the table. Or when building a primary, secondary or tertiary navigation. Or logging users in or out. Heck, you need links everywhere!

  • to pass parameters, you’ll need to do string concatenation/formatting in Razor or Javascript
  • if you move or rename your controller or its methods, effectively changing the URL, your links will break
  • if your URL schema changes say from using named ids like ?id=1 to positional ids, like /products/1 , you’ll need to update all your hardcoded URLs.

As you can see, hardcoding is a big pain in the rear. But what can you do instead? Fear not, there’s a solution that addresses all the above problems and more!

Let’s look into automatic link generation, and how you can pimp it up to make it type-safe, ensuring compile-time checking, so no 404s ever happen when you refactor your code by renaming controllers or their methods.

There are at least three different ways to make links in ASP.NET MVC Core:

  • HtmlHelperLinkExtensions.ActionLink AKA @Html.ActionLink extension method
  • Anchor tag helper,
  • Url.Action() extension method
Читайте также:  Рисование в консоли java

Unfortunately, as it’s often the case with Microsoft’s docs, it’s quite cryptic. Like how the hell are you supposed to know, based on the very scant documentation, which particular method you need to call?

  • ActionLink(IHtmlHelper, String, String)
  • ActionLink(IHtmlHelper, String, String, Object)
  • ActionLink(IHtmlHelper, String, String, String)
  • ActionLink(IHtmlHelper, String, String, Object, Object)
  • ActionLink(IHtmlHelper, String, String, String, Object)
  • ActionLink(IHtmlHelper, String, String, String, Object, Object)

Instead of trying to explain what all these parameters mean, let me just show you the most common use cases of this extension method.

    get a link to the current controller’s action:

@Html.ActionLink("Link to Index action", "Index") 
@Html.ActionLink("Link to Index action of Home controller", "Index", "Home") 
@Html.ActionLink("Link to Index action of Home controller with and name='John Doe'", "Index", "Home", new < name = "John Doe" >) 
@Html.ActionLink("Link to Index action of Home controller with and name='John Doe' and CSS class", "Index", "Home", new < name = "John Doe" >, new < @class="css-class">) 

This extension method is to be called from Views:

  This link is generated in the View:  @Html.ActionLink("Simple link to a 'Home' controller 'Index' action", "Index", "Home")  

Anchor Tag Helper

While @Html.ActionLink() is a carry-over left in ASP.NET Core for migration from .NET, the brand-spanking new way of generating links is the Anchor Tag Helper. Sporting much improved readability, it lets you do this:

Check out the documentation for the full list of supported attributes, these being the most important ones:

  • asp-controller – target controller
  • asp-action – target action
  • asp-route- – specify parameters for the action
  • asp-fragment – specify URL fragment to be added after #

This example shows how to generate a link with parameters:

  asp-controller="Home" asp-action="Details" asp-route-id="100500" asp-route-name="John Doe">A link with parameters to 'Home' controller 'Details' action 

Url.Action Helper Method

Not all links need to be generated in Views, sometimes you need to build links in your Controllers too. UrlHelperExtensions class has Url.Action method that does just that. The documentation is similarly obscure, but now you know how to navigate it.

    get a link to a ‘Home’ controller’s ‘Index’ action

Url.Action("Details", "Home", new < name = "John Doe", 

All the examples above suffer from a fundamental problem: if you rename a controller or action method, the links will break, but you’ll only going to find out about it when trying to use them. That’s clearly not good enough.

Let’s further improve the link generation by bringing in compile-time checking and retrieval of the data that we need. The following code uses Url.Action with a custom method GetControllerName and nameof operator to get names of Controller and Action:

Url.Action(nameof(HomeController.Details), Utils.GetControllerNameHomeController>(), new  name = "John Doe", id = 100500>)

In the similar fashion, you can use that approach with both @Html.ActionLink and :

 @Html.ActionLink("Safely generated link with parameters to 'Home' controller 'Details' action", nameof(HomeController.Details), Utils.GetControllerName (), new 
 asp-controller="@(Utils.GetControllerName())" asp-action="@(nameof(HomeController.Details))" asp-route-id="100500" asp-route-name="John Doe">Safely generated link with parameters to 'Home' controller 'Details' action >

And that’s a one-line implementation of GetControllerName utility function. The only reason we need it is to get rid of the Controller suffix at the end of the string.

public static string GetControllerNameT>() where T : Controller  return typeof(T).Name.Replace(nameof(Controller), string.Empty); >

Conclusion

In this article, we looked at different ways of generating links in Views and Controllers in ASP.NET Core MVC. We also looked at how to make the link generation process resilient to changes in your application and avoid breaking the links.

Get complete, tested, and working source code for this article

Download fully tested and 100% working Visual Studio solution with the source code used in this article for FREE – just enter your name and email in the form below, and I’ll send you the download link right away.

You will also get access to all the source code for all existing and new articles on the site, and access to my mailing list, which receives handy timesaving tips on .NET Core programming.

Источник

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core

Еще одной стороной механизма маршрутизации является генерации исходящих адресов в приложении, например, при выводе их в представлении. Наиболее простой способ вывода адреса является использование анкора - элемента a :

Но также мы можем использовать специальные хелперы рендеринга - Html.ActionLink и Html.RouteLink

Хелпер ActionLink создает гиперссылку на действие контроллера. Если мы создаем ссылку на действие, определенное в том же контроллере, то можем просто указать имя действия:

@Html.ActionLink("Жми здесь", "Show")

Что создаст вам следующую разметку:

Когда надо указать ссылку на действие из другого контроллера, то в хелпере ActionLink в качестве третьего аргумента имя контроллера. Например, ссылка на действие List контроллера Book будет создаваться так:

@Html.ActionLink("Список книг", "List", "Book")

Кроме того, если у нас в некотором методе Index контроллера Book определено несколько параметров:

public class BookController : Controller < public string Index(string author="Толстой", int < return author + " " + id.ToString(); >>

То перегруженная версия хелпера ActionLink позволяет передать параметр объекта (обычно анонимный тип) для параметра routeValues . Среда выполнения принимает свойства объекта и использует их для создания значений маршрутизации (имена свойств становятся именами параметров маршрута, а значения свойств представляют значения параметра маршрута). Создадим ссылку для вышеопределенного действия контроллера:

@Html.ActionLink("Все книги", "Index", "Book", new < null) //или @Html.ActionLink("Достоевский", "Index", "Book", new < author="Достоевский", null)

Последний параметр в данном хелпере является параметром htmlAttributes . Мы можем использовать этот параметр для установки значения атрибута элемента HTML. В данном случае передается значение null (то есть никаких атрибутов не устанавливается).

Теперь попробуем передать атрибуты, например, установить атрибуты id и class :

@Html.ActionLink("Все книги", "Index", "Book", new < author="Толстой",id = 10 >, new < , @class="link">)

Сгенерированная html-разметка будет выглядеть следующим образом:

Обратите внимание на знак @ перед словом class: поскольку слово "class" является зарезервированным словом в C#, то для правильного рендеринга нам надо перед ним указать знак @.

Хелпер RouteLink использует похожий шаблон, что и ActionLink : он принимает имя маршрута, но не требует аргументов для имени контроллера и имени действия. Так, первый пример с ActionLink эквивалентен следующему коду:

@Html.RouteLink("Все книги", new < controller = "Book", action = "Index", author = "Толстой", >, new < , @class = "link" >)

Чтобы использовать маршрут, нам просто надо указать имя определенного нами маршрута и затем определить при необходимости дополнительные параметры. Например, возьмем стандартный маршрут Default:

routes.MapRoute( name: "Default", url: "//", defaults: new < controller = "Home", action = "Index", >> );

Тогда создать ссылку мы можем, например, так:

@Html.RouteLink("Все книги","Default",new < action = "Show" >)

URL-хелперы

URL-хелперы похожи на хелперы ActionLink и RouteLink за тем исключением, что они не возвращают HTML, а создают пути URL и возвращают их в виде строк. Имеется три типа URL-хелперов:

Хелпер Action похож на ActionLink за тем исключением, что но не возвращает тег якоря. Например, следующий код отображает адрес URL, но не саму ссылку:

@Url.Action("Index", "Book", new < author = "Толстой", >, null)

Хелпер RouteUrl использует тот же шаблон, что и Action , но как и RouteLink , принимает имя маршрута и аргументы для параметров маршрута:

Хелпер Content преобразует относительные пути в абсолютные. Пример использования хелпера Content можно увидеть в представлении _Layout:

С помощью тильды ( ~ ) хелпер Content генерирует необходимый URL относительно расположения приложения. Без тильды URL мог бы стать некорректным, если бы вы перенесли приложение в другой виртуальный каталог.

Источник

Оцените статью