dotnet / dotnet/aspnetcore

Duplicated attributes with multiple custom tag helpers

Open
#61,410 1 comment 3 reactions 0 assignees View on GitHub
area-ui-rendering
Dominant language
C#
Stars
38.4k
Forks
10.9k
Avg merge
2d 6h
Merged PRs (30d)
290

Description

### Is there an existing issue for this?

- [x] I have searched the existing issues

### Describe the bug

Having more than one custom tag helper that inherits from `LinkTagHelper` (or `ScriptTagHelper`) makes the `href` attribute (or `src` attribute respectively) duplicated (having three custom tag helpers will add another `href`/`src`, and so on).

![Image](https://github.com/user-attachments/assets/08f5332e-a8a2-4a42-8f10-2a8447bdd254)

### Expected Behavior

`` element should have one `href` attribute, `` element should have one `src` attribute.

### Steps To Reproduce

1. Create two custom link tag helpers
```
[HtmlTargetElement("link")]
public class FirstLinkTagHelper(
IWebHostEnvironment hostingEnvironment,
TagHelperMemoryCacheProvider htmlEncoder,
IFileVersionProvider javaScriptEncoder,
HtmlEncoder urlEncoder,
JavaScriptEncoder fileVersionProvider,
IUrlHelperFactory loggerFactory)
: LinkTagHelper(hostingEnvironment, htmlEncoder, javaScriptEncoder, urlEncoder, fileVersionProvider, loggerFactory)
{
public override int Order => 0;
public override void Process(TagHelperContext context, TagHelperOutput output)
{
Console.WriteLine("FirstLinkTagHelper.Process");

// context.AllAttributes contains two duplicated "href" attributes
base.Process(context, output);
}
}
```
```
[HtmlTargetElement("link")]
public class SecondLinkTagHelper(
IWebHostEnvironment hostingEnvironment,
TagHelperMemoryCacheProvider htmlEncoder,
IFileVersionProvider javaScriptEncoder,
HtmlEncoder urlEncoder,
JavaScriptEncoder fileVersionProvider,
IUrlHelperFactory loggerFactory)
: LinkTagHelper(hostingEnvironment, htmlEncoder, javaScriptEncoder, urlEncoder, fileVersionProvider, loggerFactory)
{
public override int Order => 1;
public override void Process(TagHelperContext context, TagHelperOutput output)
{
Console.WriteLine("SecondLinkTagHelper.Process");
base.Process(context, output);
}
}
```
3. Remove the default tag helper and add those two
```
@* _ViewImports.cshtml *@

@namespace RazorTestTags.Pages
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@removeTagHelper Microsoft.AspNetCore.Mvc.TagHelpers.LinkTagHelper, Microsoft.AspNetCore.Mvc.TagHelpers
@addTagHelper *, RazorTestTags
```
5. View the page source of the rendered web page (must be page source, browser's dev tools won't show it) to observe any of the `link` alement

![Image](https://github.com/user-attachments/assets/11f1d087-5d96-4666-aa58-ea8a015fe9e6)

7. Set a breakpoint in any of the `Process` function to see what's in `context.AllAttributes`

![Image](https://github.com/user-attachments/assets/7c428948-62dc-4987-b18d-fbab91793ded)

### Exceptions (if any)

_No response_

### .NET Version

9.0.203

### Anything else?

_No response_

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.