41

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

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

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

然后我尝试了:

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

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

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

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

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

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

4

4 回答 4

48

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

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

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

<textarea></textarea>

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

<textarea disabled="disabled"></textarea>
于 2018-06-21T09:22:39.540 回答
45

我在使用 select tag helper 时遇到了同样的问题,我尝试了一些东西并且它奏效了。尝试这个-

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

于 2016-07-14T06:29:02.473 回答
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);
    }
}

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

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

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

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

whereSomeViewModel有一个DocandMustDisable属性。

public class YourSomeViewModel
{
  public string Doc { set;get; }
  public bool MustDisable  { set;get; }
}
于 2016-01-19T04:10:30.467 回答
3

由于我没有足够的声誉来为 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"
于 2016-04-11T16:11:17.927 回答