web-dev-qa-db-fra.com

asp.net désactiver conditionnellement une aide de balise (textarea)

Je souhaite activer ou désactiver une zone de texte en fonction d'une condition qui s'évalue à partir du modèle, et j'utilise l'assistant de balise de zone de texte. En d'autres termes, quelque chose comme ça:

<textarea asp-for="Doc" @(Model.MustDisable ? "disabled" : "")></textarea>

Mais j'ai eu l'erreur de conception suivante: l'assistant de balise 'textarea' ne doit pas avoir C # dans la zone de déclaration d'attribut de l'élément.

J'ai ensuite essayé:

<textarea asp-for="Doc" disabled='@(Model.MustDisable ? "disabled" : "")'></textarea>

qui n'a montré aucune erreur au moment de la conception mais il se présente comme suit: Model.MustDisable==true rend disabled='disabled' ET Model.MustDisable==false rend disabled. La zone de texte sera donc toujours désactivée.

Ensuite, j'ai essayé (en supprimant les):

textarea asp-for="Doc" disabled=@(Model.MustDisable ? "disabled" : "")></textarea>

qui n'a montré aucune erreur au moment de la conception mais qui est identique à la précédente.

Comment puis-je mettre cela en œuvre correctement?

29
VMh

J'étais confronté au même problème avec l'assistant de sélection de balises, j'ai essayé peu de choses et cela a fonctionné. Essaye ça-

<textarea asp-for="Doc" disabled="@(Model.MustDisable ? "disabled" : null)"></textarea>
34
GauravD

L'assistant de balise textarea ne prend pas directement en charge le rendu conditionnel d'une zone de texte désactivée. Mais vous pouvez toujours étendre le TextAreaTagHelper et ajouter cette fonctionnalité.

Créez donc une nouvelle classe qui hérite de la classe TextAreaTagHelper.

[HtmlTargetElement("textarea", Attributes = ForAttributeName)]
public class MyCustomTextArea : TextAreaTagHelper
{
    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)
        {
            output.Attributes["disabled"] = "disabled";
        }           
        base.Process(context, output);
    }
}

Dans votre _ViewImports.cshtml fichier, à l'aide du @addTagHelper directive, spécifiez l'assembly dans lequel la classe ci-dessus est définie afin que notre nouvel assistant de balise soit disponible dans d'autres vues de rasoir.

@addTagHelper "*, Microsoft.AspNet.Mvc.TagHelpers"
@addTagHelper "*,YourAssemblyNameHere"

Maintenant, dans vos vues, vous pouvez l'utiliser comme

@model YourSomeViewModel
<textarea asp-for="Doc" asp-is-disabled="Model.MustDisable"></textarea>

SomeViewModel a une propriété Doc et MustDisable.

public class YourSomeViewModel
{
  public string Doc { set;get; }
  public bool MustDisable  { set;get; }
}
18
Shyju

C'est en fait très simple, l'attribut disable fonctionne déjà comme vous le souhaitez - vous pouvez passer une valeur booléenne:

<textarea asp-for="Doc" disabled="@Model.MustDisable"></textarea>

si false, l'attribut disabled n'est pas rendu

10
Daniel Stackenland

Je poste ceci séparément car je n'ai pas assez de réputation pour ajouter un commentaire à la réponse de Shyju.

Si vous héritez de l'un des assistants de balise par défaut, puis enregistrez à la fois les aides de balise par défaut et votre assistant de balise personnalisé dans _ViewImports.cshtml, les deux aides de balise seront exécutées pour les balises spécifiées.

Pour la suite:

[HtmlTargetElement("textarea", Attributes = ForAttributeName)]
public class MyCustomTextArea : TextAreaTagHelper
{
    private const string ForAttributeName = "asp-for";
...

Avec le _ViewImports.cshtml suivant:

@addTagHelper "*, Microsoft.AspNet.Mvc.TagHelpers"
@addTagHelper "*,YourAssemblyNameHere"

MyCustomTextArea et TextAreaTagHelper seront exécutés pour chaque balise textarea.

Je n'ai remarqué aucun problème avec la sortie générée pour les zones de texte, mais j'ai rencontré des problèmes hérités des autres aides de balise par défaut. La solution consiste à supprimer l'assistant de balise par défaut dans _ViewImports.cshtml.

@addTagHelper "*, Microsoft.AspNet.Mvc.TagHelpers"
@addTagHelper "*,YourAssemblyNameHere"
@removeTagHelper "Microsoft.AspNet.Mvc.TagHelpers.TextAreaTagHelper, Microsoft.AspNet.Mvc.TagHelpers"
3
Eric Scott