Tag helper to add class if the model is invalid











up vote
1
down vote

favorite
1












I need to add a specific class to the input if the model is invalid



ValidationErrorClassTagHelper.cs



[HtmlTargetElement("input", Attributes = ValidationForAttributeName + "," + ValidationErrorClassName)]
public class ValidationErrorClassTagHelper : TagHelper
{
private const string ValidationForAttributeName = "validation-for";

private const string ValidationErrorClassName = "validationerror-class";

[HtmlAttributeName(ValidationForAttributeName)]
public ModelExpression For { get; set; }

[HtmlAttributeName(ValidationErrorClassName)]
public string ValidationErrorClass { get; set; }

[HtmlAttributeNotBound]
[ViewContext]
public ViewContext ViewContext { get; set; }

public override void Process(TagHelperContext context, TagHelperOutput output)
{
ViewContext.ViewData.ModelState.TryGetValue(For.Name, out ModelStateEntry entry);
if (entry != null && entry.Errors.Any())
{
output.AddClass(ValidationErrorClass, HtmlEncoder.Default);
}
}
}


AccountViewModels.cs



using System.ComponentModel.DataAnnotations;

namespace AccountViewModels
{
public class LoginViewModel
{
[Required]
[EmailAddress]
public string Email { get; set; }

[Required]
[DataType(DataType.Password)]
public string Password { get; set; }
}
}


Login.cshtml



@model LoginViewModel

<form method="post" asp-action="Login">
<input asp-for="Email" validation-for="Email" validationerror-class="is-invalid"/>
<input asp-for="Password" validation-for="Password" validationerror-class="is-invalid"/>
<button type="submit" class="btn btn-primary">Login</button>
</form>


Generated html is the email is invalid for example



<input class="input-validation-error is-invalid" type="text" data-val="true" data-val-required="The Email field is required." id="Email" name="Email" value="">



  1. Is the good way to do this ?

  2. Is there a native way to do that using Asp.Net Core 2?










share|improve this question


























    up vote
    1
    down vote

    favorite
    1












    I need to add a specific class to the input if the model is invalid



    ValidationErrorClassTagHelper.cs



    [HtmlTargetElement("input", Attributes = ValidationForAttributeName + "," + ValidationErrorClassName)]
    public class ValidationErrorClassTagHelper : TagHelper
    {
    private const string ValidationForAttributeName = "validation-for";

    private const string ValidationErrorClassName = "validationerror-class";

    [HtmlAttributeName(ValidationForAttributeName)]
    public ModelExpression For { get; set; }

    [HtmlAttributeName(ValidationErrorClassName)]
    public string ValidationErrorClass { get; set; }

    [HtmlAttributeNotBound]
    [ViewContext]
    public ViewContext ViewContext { get; set; }

    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
    ViewContext.ViewData.ModelState.TryGetValue(For.Name, out ModelStateEntry entry);
    if (entry != null && entry.Errors.Any())
    {
    output.AddClass(ValidationErrorClass, HtmlEncoder.Default);
    }
    }
    }


    AccountViewModels.cs



    using System.ComponentModel.DataAnnotations;

    namespace AccountViewModels
    {
    public class LoginViewModel
    {
    [Required]
    [EmailAddress]
    public string Email { get; set; }

    [Required]
    [DataType(DataType.Password)]
    public string Password { get; set; }
    }
    }


    Login.cshtml



    @model LoginViewModel

    <form method="post" asp-action="Login">
    <input asp-for="Email" validation-for="Email" validationerror-class="is-invalid"/>
    <input asp-for="Password" validation-for="Password" validationerror-class="is-invalid"/>
    <button type="submit" class="btn btn-primary">Login</button>
    </form>


    Generated html is the email is invalid for example



    <input class="input-validation-error is-invalid" type="text" data-val="true" data-val-required="The Email field is required." id="Email" name="Email" value="">



    1. Is the good way to do this ?

    2. Is there a native way to do that using Asp.Net Core 2?










    share|improve this question
























      up vote
      1
      down vote

      favorite
      1









      up vote
      1
      down vote

      favorite
      1






      1





      I need to add a specific class to the input if the model is invalid



      ValidationErrorClassTagHelper.cs



      [HtmlTargetElement("input", Attributes = ValidationForAttributeName + "," + ValidationErrorClassName)]
      public class ValidationErrorClassTagHelper : TagHelper
      {
      private const string ValidationForAttributeName = "validation-for";

      private const string ValidationErrorClassName = "validationerror-class";

      [HtmlAttributeName(ValidationForAttributeName)]
      public ModelExpression For { get; set; }

      [HtmlAttributeName(ValidationErrorClassName)]
      public string ValidationErrorClass { get; set; }

      [HtmlAttributeNotBound]
      [ViewContext]
      public ViewContext ViewContext { get; set; }

      public override void Process(TagHelperContext context, TagHelperOutput output)
      {
      ViewContext.ViewData.ModelState.TryGetValue(For.Name, out ModelStateEntry entry);
      if (entry != null && entry.Errors.Any())
      {
      output.AddClass(ValidationErrorClass, HtmlEncoder.Default);
      }
      }
      }


      AccountViewModels.cs



      using System.ComponentModel.DataAnnotations;

      namespace AccountViewModels
      {
      public class LoginViewModel
      {
      [Required]
      [EmailAddress]
      public string Email { get; set; }

      [Required]
      [DataType(DataType.Password)]
      public string Password { get; set; }
      }
      }


      Login.cshtml



      @model LoginViewModel

      <form method="post" asp-action="Login">
      <input asp-for="Email" validation-for="Email" validationerror-class="is-invalid"/>
      <input asp-for="Password" validation-for="Password" validationerror-class="is-invalid"/>
      <button type="submit" class="btn btn-primary">Login</button>
      </form>


      Generated html is the email is invalid for example



      <input class="input-validation-error is-invalid" type="text" data-val="true" data-val-required="The Email field is required." id="Email" name="Email" value="">



      1. Is the good way to do this ?

      2. Is there a native way to do that using Asp.Net Core 2?










      share|improve this question













      I need to add a specific class to the input if the model is invalid



      ValidationErrorClassTagHelper.cs



      [HtmlTargetElement("input", Attributes = ValidationForAttributeName + "," + ValidationErrorClassName)]
      public class ValidationErrorClassTagHelper : TagHelper
      {
      private const string ValidationForAttributeName = "validation-for";

      private const string ValidationErrorClassName = "validationerror-class";

      [HtmlAttributeName(ValidationForAttributeName)]
      public ModelExpression For { get; set; }

      [HtmlAttributeName(ValidationErrorClassName)]
      public string ValidationErrorClass { get; set; }

      [HtmlAttributeNotBound]
      [ViewContext]
      public ViewContext ViewContext { get; set; }

      public override void Process(TagHelperContext context, TagHelperOutput output)
      {
      ViewContext.ViewData.ModelState.TryGetValue(For.Name, out ModelStateEntry entry);
      if (entry != null && entry.Errors.Any())
      {
      output.AddClass(ValidationErrorClass, HtmlEncoder.Default);
      }
      }
      }


      AccountViewModels.cs



      using System.ComponentModel.DataAnnotations;

      namespace AccountViewModels
      {
      public class LoginViewModel
      {
      [Required]
      [EmailAddress]
      public string Email { get; set; }

      [Required]
      [DataType(DataType.Password)]
      public string Password { get; set; }
      }
      }


      Login.cshtml



      @model LoginViewModel

      <form method="post" asp-action="Login">
      <input asp-for="Email" validation-for="Email" validationerror-class="is-invalid"/>
      <input asp-for="Password" validation-for="Password" validationerror-class="is-invalid"/>
      <button type="submit" class="btn btn-primary">Login</button>
      </form>


      Generated html is the email is invalid for example



      <input class="input-validation-error is-invalid" type="text" data-val="true" data-val-required="The Email field is required." id="Email" name="Email" value="">



      1. Is the good way to do this ?

      2. Is there a native way to do that using Asp.Net Core 2?







      c# asp.net-core






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Apr 8 at 10:17







      user149517





























          1 Answer
          1






          active

          oldest

          votes

















          up vote
          2
          down vote













          Have you considered adding style rules to class input-validation-error? It gets added to input element when its value is recognized as invalid.



          See live example on .NET Fiddle.



          However, if you really need to add your own custom class, take notice that your code only adds custom class to input elements on server side, so that specific class will stay on input elements forever (until next HTTP request). Earlier, I suggested making use of default input-validation-error class, because jQuery validation plugin takes care of removal that class when it discovers the input value as valid. Eventually, you would have to implement same client-side mechanism to remove/add your custom class probably by writing custom jQuery validation script.



          Of course, none of above is a real problem if you simply do not care about dynamic client-side validation.






          share|improve this answer








          New contributor




          Prolog is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
          Check out our Code of Conduct.


















            Your Answer





            StackExchange.ifUsing("editor", function () {
            return StackExchange.using("mathjaxEditing", function () {
            StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
            StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
            });
            });
            }, "mathjax-editing");

            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "196"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            convertImagesToLinks: false,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: null,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f191527%2ftag-helper-to-add-class-if-the-model-is-invalid%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown
























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes








            up vote
            2
            down vote













            Have you considered adding style rules to class input-validation-error? It gets added to input element when its value is recognized as invalid.



            See live example on .NET Fiddle.



            However, if you really need to add your own custom class, take notice that your code only adds custom class to input elements on server side, so that specific class will stay on input elements forever (until next HTTP request). Earlier, I suggested making use of default input-validation-error class, because jQuery validation plugin takes care of removal that class when it discovers the input value as valid. Eventually, you would have to implement same client-side mechanism to remove/add your custom class probably by writing custom jQuery validation script.



            Of course, none of above is a real problem if you simply do not care about dynamic client-side validation.






            share|improve this answer








            New contributor




            Prolog is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
            Check out our Code of Conduct.






















              up vote
              2
              down vote













              Have you considered adding style rules to class input-validation-error? It gets added to input element when its value is recognized as invalid.



              See live example on .NET Fiddle.



              However, if you really need to add your own custom class, take notice that your code only adds custom class to input elements on server side, so that specific class will stay on input elements forever (until next HTTP request). Earlier, I suggested making use of default input-validation-error class, because jQuery validation plugin takes care of removal that class when it discovers the input value as valid. Eventually, you would have to implement same client-side mechanism to remove/add your custom class probably by writing custom jQuery validation script.



              Of course, none of above is a real problem if you simply do not care about dynamic client-side validation.






              share|improve this answer








              New contributor




              Prolog is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
              Check out our Code of Conduct.




















                up vote
                2
                down vote










                up vote
                2
                down vote









                Have you considered adding style rules to class input-validation-error? It gets added to input element when its value is recognized as invalid.



                See live example on .NET Fiddle.



                However, if you really need to add your own custom class, take notice that your code only adds custom class to input elements on server side, so that specific class will stay on input elements forever (until next HTTP request). Earlier, I suggested making use of default input-validation-error class, because jQuery validation plugin takes care of removal that class when it discovers the input value as valid. Eventually, you would have to implement same client-side mechanism to remove/add your custom class probably by writing custom jQuery validation script.



                Of course, none of above is a real problem if you simply do not care about dynamic client-side validation.






                share|improve this answer








                New contributor




                Prolog is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                Check out our Code of Conduct.









                Have you considered adding style rules to class input-validation-error? It gets added to input element when its value is recognized as invalid.



                See live example on .NET Fiddle.



                However, if you really need to add your own custom class, take notice that your code only adds custom class to input elements on server side, so that specific class will stay on input elements forever (until next HTTP request). Earlier, I suggested making use of default input-validation-error class, because jQuery validation plugin takes care of removal that class when it discovers the input value as valid. Eventually, you would have to implement same client-side mechanism to remove/add your custom class probably by writing custom jQuery validation script.



                Of course, none of above is a real problem if you simply do not care about dynamic client-side validation.







                share|improve this answer








                New contributor




                Prolog is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                Check out our Code of Conduct.









                share|improve this answer



                share|improve this answer






                New contributor




                Prolog is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                Check out our Code of Conduct.









                answered yesterday









                Prolog

                215




                215




                New contributor




                Prolog is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                Check out our Code of Conduct.





                New contributor





                Prolog is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                Check out our Code of Conduct.






                Prolog is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                Check out our Code of Conduct.






























                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Code Review Stack Exchange!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    Use MathJax to format equations. MathJax reference.


                    To learn more, see our tips on writing great answers.





                    Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


                    Please pay close attention to the following guidance:


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f191527%2ftag-helper-to-add-class-if-the-model-is-invalid%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    Mont Emei

                    Province de Neuquén

                    Journaliste