sintaxis pages net lista index framework elementos cshtml concatenar comentarios asp razor asp.net-core-mvc tag-helpers

razor - pages - asp.net deshabilita condicionalmente un ayudante de etiqueta(área de texto)



razor lista (4)

Quiero habilitar o deshabilitar un área de texto dependiendo de una condición que se evalúe a partir del modelo, y estoy usando el asistente de etiquetas de área de texto. En otras palabras, algo como esto:

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

Pero obtuve el siguiente error de tiempo de diseño: el ayudante de la etiqueta ''textarea'' no debe tener C # en el área de declaración de atributos del elemento.

Entonces intenté:

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

que no mostró ningún error de tiempo de diseño, pero se muestra así: Model.MustDisable==true renders disabled=''disabled'' Y Model.MustDisable==false renders disabled . Así que el área de texto siempre estará deshabilitada.

Entonces intenté (quitando los ''s):

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

que no mostró ningún error de tiempo de diseño pero se reproduce igual que el anterior.

¿Cómo puedo implementar esto de la manera correcta?


El ayudante de la etiqueta textarea no tiene soporte directo para representar condicionalmente un área de texto deshabilitado. Pero siempre puedes extender el TextAreaTagHelper y agregar esta característica.

Así que crea una nueva clase que hereda de la clase 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); } }

En su archivo _ViewImports.cshtml , utilizando la directiva @addTagHelper , especifique el ensamblaje donde se define la clase anterior para que nuestro nuevo ayudante de etiquetas esté disponible en otras vistas de afeitar.

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

Ahora en tus vistas, puedes usarlo como

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

donde SomeViewModel tiene una propiedad Doc y MustDisable .

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


En realidad, es muy simple, el atributo de desactivación ya está funcionando como usted desea, puede pasar un valor booleano:

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

Si es falso, el atributo disabled no se representa.


Estaba enfrentando el mismo problema con el ayudante de selección de etiquetas, probé algunas cosas y funcionó. Prueba esto-

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


Estoy publicando esto por separado ya que no tengo suficiente reputación para agregar un comentario a la respuesta de Shyju.

Si hereda de uno de los ayudantes de etiquetas predeterminados y luego registra los ayudantes de etiquetas predeterminados y su ayudante de etiquetas personalizado en _ViewImports.cshtml, entonces ambos ayudantes de etiquetas se ejecutarán para las etiquetas especificadas.

Para el siguiente:

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

Con el siguiente _ViewImports.cshtml:

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

Tanto MyCustomTextArea como TextAreaTagHelper se ejecutarán para cada etiqueta de área de texto.

No noté ningún problema con la salida generada para textareas, pero me he encontrado con problemas heredados de otros ayudantes de etiquetas predeterminados. La solución es eliminar el ayudante de etiquetas predeterminado en _ViewImports.cshtml.

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