Razor asp.net有条件地禁用标记帮助程序(textarea)

Razor asp.net有条件地禁用标记帮助程序(textarea),razor,asp.net-core-mvc,tag-helpers,Razor,Asp.net Core Mvc,Tag Helpers,我想根据从模型中评估的条件启用或禁用textarea,并且我正在使用textarea标记帮助器。 换句话说,类似这样的事情: <textarea asp-for="Doc" @(Model.MustDisable ? "disabled" : "")></textarea> 它没有显示任何设计时错误,但渲染结果与前一个相同 如何以正确的方式实现此功能?textarea标记辅助程序不直接支持有条件地呈现禁用的文本区域。但您始终可以扩展TextAreaTagHelper并添

我想根据从模型中评估的条件启用或禁用textarea,并且我正在使用textarea标记帮助器。 换句话说,类似这样的事情:

<textarea asp-for="Doc" @(Model.MustDisable ? "disabled" : "")></textarea>
它没有显示任何设计时错误,但渲染结果与前一个相同


如何以正确的方式实现此功能?

textarea标记辅助程序不直接支持有条件地呈现禁用的文本区域。但您始终可以扩展
TextAreaTagHelper
并添加此功能

因此,创建一个从
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);
    }
}
在您的
\u ViewImports.cshtml
文件中,使用
@addTagHelper
指令,指定定义上述类的程序集,以便在其他视图中可以使用我们的新标记helper

@addTagHelper "*, Microsoft.AspNet.Mvc.TagHelpers"
@addTagHelper "*,YourAssemblyNameHere"
现在在您的视图中,您可以像

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

我单独发布这篇文章,因为我没有足够的声誉给Shyju的回答添加评论

如果从其中一个默认标记帮助器继承,然后在_ViewImports.cshtml中注册默认标记帮助器和自定义标记帮助器,则将为指定的标记执行两个标记帮助器

有关下列事项:

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

@addTagHelper "*, Microsoft.AspNet.Mvc.TagHelpers"
@addTagHelper "*,YourAssemblyNameHere"
将为每个textarea标记执行
MyCustomTextArea
TextAreaTagHelper

我没有注意到为textareas生成的输出有任何问题,但从其他默认标记帮助程序继承时遇到了问题。解决方案是删除_ViewImports.cshtml中的默认标记帮助器

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

我在使用selecttaghelper时也遇到了同样的问题,我尝试了几件事情,结果都成功了。 试试这个-


实际上非常简单,disable属性已经按照您的需要工作了-您可以传入一个布尔值:

<textarea asp-for="Doc" disabled="@Model.MustDisable"></textarea>
如果为true,则
disabled
属性设置为“disabled”:



为什么不也有条件地呈现disabled属性呢?我不认为这在所有浏览器上都适用disabled=“”将导致输入被禁用。@user942620您是对的,但只是在使用“”而不是nullThis的情况下!!!谢谢!我仍然想知道为什么MS不允许常规@(条件?“禁用”:“”),但我打算扩展TagHelper(对于这样一个小东西来说太多工作了!),而这个解决方案节省了我的时间!;)@removeTagHelper Microsoft.AspNetCore.Mvc.TagHelpers.InputTagHelper,Microsoft.AspNetCore.Mvc.TagHelpers比最上面投票的答案效果更好,也比使用三元表达式添加禁用属性要好一些。谢谢为什么投票结果没有提高?这是一个完美的、雄辩的、可能是最“正确”的解决方案。@RyanO'Neill这就是它的工作原理!尝试一下,您将看到:-)。如果您发送false,TagHelper将根本不会打印属性。我也会更新我的答案以澄清。@Jess-这是一个内置的Tag Helper(我不知道是否可以称之为magic)哇,magic。在核心3.1中确认-这应该是可接受的答案。@vmh请接受这一答案。它按预期工作,在传递值
false
时,不会呈现
disabled
属性。
@addTagHelper "*, Microsoft.AspNet.Mvc.TagHelpers"
@addTagHelper "*,YourAssemblyNameHere"
@addTagHelper "*, Microsoft.AspNet.Mvc.TagHelpers"
@addTagHelper "*,YourAssemblyNameHere"
@removeTagHelper "Microsoft.AspNet.Mvc.TagHelpers.TextAreaTagHelper, Microsoft.AspNet.Mvc.TagHelpers"
<textarea asp-for="Doc" disabled="@Model.MustDisable"></textarea>
<textarea></textarea>
<textarea disabled="disabled"></textarea>