asp.net 有条件地禁用标签助手(textarea)

Posted

技术标签:

【中文标题】asp.net 有条件地禁用标签助手(textarea)【英文标题】:asp.net conditionally disable a tag helper (textarea) 【发布时间】:2016-01-19 00:27:07 【问题描述】:

我想根据从模型评估的条件启用或禁用 textarea,并且我正在使用 textarea 标签助手。 换句话说,是这样的:

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

但我收到以下设计时错误:标签助手“textarea”在元素的属性声明区域中不能有 C#。

然后我尝试了:

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

没有显示任何设计时错误,但呈现如下: Model.MustDisable==true 呈现 disabled='disabled'Model.MustDisable==false 呈现 disabled。 因此文本区域将始终被禁用。

然后我尝试(删除's):

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

没有显示任何设计时错误,但呈现与前一个相同。

我怎样才能以正确的方式实现这一点?

【问题讨论】:

为什么不同时有条件地渲染 disabled 属性? 【参考方案1】:

其实很简单,disable 属性已经按照你的意愿工作了——你可以传入一个布尔值:

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

如果为 false,则不呈现 disabled 属性:

<textarea></textarea>

如果为真,disabled 属性设置为“禁用”:

<textarea disabled="disabled"></textarea>

【讨论】:

为什么这个投票不高?这是完美、雄辩且可能最“正确”的解决方案。 @RyanO'Neill 这就是它的工作原理!试试看,你会看到:-)。如果您发送 false,TagHelper 将根本不会打印出该属性。我也会更新我的答案以澄清。 @Jess - 它是一个内置的标签助手(我不知道我是否称它为魔法)docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers 哇,好神奇。在 Core 3.1 中确认 - 这应该是公认的答案。 @vmh 请接受这个作为答案。它按预期工作,在传递值 false 时不呈现 disabled 属性。【参考方案2】:

我在使用选择标签助手时遇到了同样的问题,我尝试了一些东西并且它起作用了。 试试这个-

&lt;textarea asp-for="Doc" disabled="@(Model.MustDisable ? "disabled" : null)"&gt;&lt;/textarea&gt;

【讨论】:

我认为这不适用于所有浏览器。 ' disabled="" ' 将导致输入被禁用。 @user942620 你是对的,但只是在使用“”而不是 null 的情况下 这个!!!非常感谢!我仍然想知道为什么 MS 不允许常规 @(condition ? "disabled" : ""),但我打算扩展 TagHelper(对于这么小的东西来说工作量太大了!),这个解决方案拯救了我的一天! ;) @user942620 我知道这已经很老了,但是您的评论需要更正。的确,所有浏览器都应该将disabled="false" 呈现为禁用状态,但我们实际上并没有在这里编写 html标签助手正在编写HTML。如果标签助手看到disabled="false",它不会呈现disabled 属性。【参考方案3】:

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);
    

在您的_ViewImports.cshtml 文件中,使用@addTagHelper 指令指定定义上述类的程序集,以便我们的新标签助手可用于其他剃须刀视图。

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

现在在你看来,你可以像这样使用它

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

其中SomeViewModel 具有DocMustDisable 属性。

public class YourSomeViewModel

  public string Doc  set;get; 
  public bool MustDisable   set;get; 

【讨论】:

比最高投票的答案更好,也比使用三元表达式添加禁用属性更好。谢谢!【参考方案4】:

我将这个单独发布,因为我没有足够的声誉来为 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"

MyCustomTextAreaTextAreaTagHelper 都将为每个 textarea 标签执行。

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

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

【讨论】:

@removeTagHelper Microsoft.AspNetCore.Mvc.TagHelpers.InputTagHelper, Microsoft.AspNetCore.Mvc.TagHelpers

以上是关于asp.net 有条件地禁用标签助手(textarea)的主要内容,如果未能解决你的问题,请参考以下文章

在 asp.net 核心中使用输入标签助手 - “值”为空

用于引导切换的 asp.net 核心 mvc 标签助手

RenderSection() 是不是在 ASP.NET Core 的 <environment> 标签助手中工作?

标签助手未在 ASP.NET Core 2 中处理

asp.net core 选择标签助手

ASP.NET Core MVC 标签助手参数中的字符串文字