This post is going to take a look at a couple of new ways, as of ASP.NET Core Preview 7, to make it easier to deal with components that have a lot of attributes. The example we are going to use is an input control as they provide a lot of built-in attributes.

Initial Component

The following is a basic component named InputComponent. It contains a single HTLM input element with properties for ID, Type, and Placeholder text.

<input id="@Id"

type="@Type"

placeholder="@Placeholder"/>



@code {

[Parameter]

private string Id {get; set;} = "DefaultId";



[Parameter]

private string Type {get; set;} = "text";



[Parameter]

private string Placeholder {get; set;} = string.Empty;

}

The following is an example usage of the above component to show an email input element.

<InputComponent Id="InputTest" Placeholder="Email Address" Type="email" />

Input Attributes Dictionary

The following code is the same component that has been converted pull attributes out of a dictionary.

<input @attributes="InputAttributes" />



@code {

[Parameter(CaptureUnmatchedValues = true)]

private Dictionary<string, object> InputAttributes { get; set; } =

new Dictionary<string, object>()

{

{ "id", "DefaultId" },

{ "type", "text" },

{ "placeholder", "" }

};

}

The results of both are the same but in this version, you don’t have to pre-define all of the attributes you might expect and it still allows you to provide defaults by prepopulating the dictionary with the default values you would like to use.

Without the [Parameter(CaptureUnmatchedValues = true)] it seems like you still need parameters on your component to match the attribute values passed in so I’m not sure how useful using a dictionary is without capturing unmatch values other than keeping you from having to specify each value in the HTML element. I was hoping to not need the parameters defined and it captures based on the values in the dictionary.

Wrapping Up

This feature is a nice addition that can save you some keystrokes. Check out the official docs for the full details.