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

VMh*_*VMh 23 razor asp.net-core-mvc tag-helpers

我想启用或禁用textarea取决于从模型中评估的条件,我正在使用textarea标记帮助器.换句话说,这样的事情:

<textarea asp-for="Doc" @(Model.MustDisable ? "disabled" : "")></textarea>
Run Code Online (Sandbox Code Playgroud)

但是我得到了以下设计时错误:标签帮助器'textarea'在元素的属性声明区域中不能有C#.

然后我尝试了:

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

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

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

textarea asp-for="Doc" disabled=@(Model.MustDisable ? "disabled" : "")></textarea>
Run Code Online (Sandbox Code Playgroud)

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

我怎样才能以正确的方式实施?

小智 35

我在选择标签帮助器时遇到了同样的问题,我尝试了很少的东西而且它有效.试试这个-

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

  • 我认为这不适用于所有浏览器.'disabled =""'将导致输入被禁用. (4认同)
  • @user942620我知道这已经很老了,但你的评论需要纠正。确实,所有浏览器都应该将 `disabled="false"` 渲染为禁用,但我们实际上并没有在这里编写 HTML。**标签助手**正在编写 HTML。如果标签助手看到 `disabled="false"`,它不会渲染 `disabled` 属性。 (2认同)

Shy*_*yju 19

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

@addTagHelper "*, Microsoft.AspNet.Mvc.TagHelpers"
@addTagHelper "*,YourAssemblyNameHere"
Run Code Online (Sandbox Code Playgroud)

现在在您的视图中,您可以像使用它一样使用它

@model YourSomeViewModel
<textarea asp-for="Doc" asp-is-disabled="Model.MustDisable"></textarea>
Run Code Online (Sandbox Code Playgroud)

哪里SomeViewModelDocMustDisable财产.

public class YourSomeViewModel
{
  public string Doc { set;get; }
  public bool MustDisable  { set;get; }
}
Run Code Online (Sandbox Code Playgroud)


Dan*_*and 14

它实际上非常简单,disable属性已经可以正常工作 - 你可以传入一个布尔值:

<textarea asp-for="Doc" disabled="@Model.MustDisable"></textarea>
Run Code Online (Sandbox Code Playgroud)

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

  • @RyanO'Neill 这就是它的工作原理!尝试一下,您就会看到:-)。如果您发送 false,TagHelper 将根本不会打印出该属性。我也会更新我的答案以进行澄清。 (4认同)
  • 哇,魔法。在核心 3.1 中得到确认 - 这应该是公认的答案。 (2认同)