Home > Software engineering >  Using "asp-for" on a double or decimal property results in a type=text input
Using "asp-for" on a double or decimal property results in a type=text input

Time:09-17

According to https://docs.microsoft.com/en-us/aspnet/core/mvc/views/working-with-forms?view=aspnetcore-6.0#the-input-tag-helper, asp-for should change the input type attribute according to the bound property. However, that's not what I'm getting. I've created a new ASP.NET 6 (MVC) webapp and created a model:

    public class MyModel
    {
        public double MyProperty { get; set; } = 1.45d;
    }

and Index.cshtml to

@model MyModel;

<div >
<input asp-for="MyProperty"/>
</div>

When I inspect the element with Firefox's dev tools, I get:

<input type="text" data-val="true" data-val-number="The field MyProperty must be a number." data-val-required="The MyProperty field is required." id="MyProperty" name="MyProperty" value="">

Shouldn't it be type=number?

CodePudding user response:

It looks like the documentation does not match with the implementation.

.NET type Input type
Single, Double type="number"

The source code on github shows below mapping of data types to input types.

Notice how Double is being mapped to InputType.Text.

private static readonly Dictionary<string, string> _defaultInputTypes =
    new(StringComparer.OrdinalIgnoreCase)
    {
        // ...
        { nameof(Byte), "number" },
        { nameof(SByte), "number" },
        { nameof(Int16), "number" },
        { nameof(UInt16), "number" },
        { nameof(Int32), "number" },
        { nameof(UInt32), "number" },
        { nameof(Int64), "number" },
        { nameof(UInt64), "number" },
        { nameof(Single), InputType.Text.ToString().ToLowerInvariant() },
        { nameof(Double), InputType.Text.ToString().ToLowerInvariant() },
        { nameof(Boolean), InputType.CheckBox.ToString().ToLowerInvariant() },
        { nameof(Decimal), InputType.Text.ToString().ToLowerInvariant() } 
        // ...            
    };

Do notice that for e.g. a Double a data-val-number attribute is being rendered as part of the unobtrusive input validation.

data-val-number="The field MyProperty must be a number." 
  • Related