Search code examples
c#razorasp.net-coreasp.net-core-tag-helpers

Input Tag Helper Not Working with Razor Code


I want to combine an input tag helper with razor code to set an attribute but I cannot get the two technologies to work together. I am simply trying to set the disabled attribute on the input field based on the value of view model property.

When i put the razor code after the asp-for tag the razor intellisense is not recognized and the field is not disabled as expected...

<input asp-for="OtherDrugs" @((Model.OtherDrugs == null) ? "disabled" : "") class="form-control" />

Rendered output...

<input type="text" id="OtherDrugs" name="OtherDrugs" value="" />

When i put the razor code before the asp-for tag the tag helper intellisense is not recognized and the field is not set with the view model properties as expected...

<input @((Model.OtherDrugs == null) ? "disabled" : "") asp-for="OtherDrug" class="form-control" />

Rendered output...

<input disabled asp-for="OtherDrugs" class="form-control" />

Note that combining tag helpers and razor does work if the razor code is inside a class attribute. Unfortunately input fields require the disabled attribute and not the disabled class for bootstrap 3.

Is there a way to make this work?


Solution

  • To render the disabled input element, you simply need to add a disabled attribute. All the below will render a disabled input text element.

    <input type="checkbox" disabled />
    <input type="checkbox" disabled="disabled" />
    <input type="checkbox" disabled="false" />
    <input type="checkbox" disabled="no" />
    <input type="checkbox" disabled="enabled" />
    <input type="checkbox" disabled="why is it still disabled" />
    

    In Asp.NET Core, You can extend the existing input tag helper to create a readonly input tag helper.

    Extend the InputTagHelper class, add a new property to identify whether the input should be disabled or not and based on this value, add the "disabled" attribute to the input.

    [HtmlTargetElement("input", Attributes = ForAttributeName)]
    public class MyCustomTextArea : InputTagHelper
    {
        private const string ForAttributeName = "asp-for";
    
        [HtmlAttributeName("asp-is-disabled")]
        public bool IsDisabled { set; get; }
    
        public MyCustomTextArea(IHtmlGenerator generator) : base(generator)
        {
        }
    
        public override void Process(TagHelperContext context, TagHelperOutput output)
        {
            if (IsDisabled)
            {
                var d = new TagHelperAttribute("disabled", "disabled");
                output.Attributes.Add(d);
            }
            base.Process(context, output);
        }
    }
    

    Now to use this custom textarea helper, you need to call the addTagHelper method in _ViewImports.cshtml.

    @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
    @addTagHelper *, YourAssemblyNameHere
    

    Now in your view, you can specify the asp-is-disabled attribute value.

    <input type="text" asp-for="OtherDrugs" 
                                      asp-is-disabled="@Model.OtherDrugs==null"/>