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

asp.net conditionally disable a tag helper (textarea)

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

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

但是我遇到了以下设计时错误:标记帮助器'textarea'不能在元素的属性声明区域中包含C#。

然后我尝试了:

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

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

然后,我尝试(删除的):

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

它没有显示任何设计时间错误,但与上一个相同。

我该如何正确实施呢?


我在选择标签帮助程序时遇到了同样的问题,我尝试了几件事,但仍然有效。
试试这个-

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


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

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

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

1
<textarea></textarea>

如果为true,则disabled属性设置为"禁用":

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


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

因此,创建一个继承自TextAreaTagHelper类的新类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[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指令,指定定义了上述类的程序集,以便在其他剃刀视图中可以使用我们的新标记帮助器。

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

现在,在您的视图中,您可以像

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

其中SomeViewModel具有DocMustDisable属性。

1
2
3
4
5
public class YourSomeViewModel
{
  public string Doc { set;get; }
  public bool MustDisable  { set;get; }
}


由于我没有足够的声誉在Shyju的答案中添加评论,因此我将其单独发布。

如果您从默认标记助手中的一个继承而来,然后在_ViewImports.cshtml中注册了默认标记助手和您的自定义标记助手,则将对指定标记执行这两个标记助手。

对于以下内容:

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

使用以下_ViewImports.cshtml:

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

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

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

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