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

时间:2016-01-19 00:27:07

标签: razor asp.net-core-mvc tag-helpers

我想启用或禁用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>

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

我该如何以正确的方式实施?

4 个答案:

答案 0 :(得分:33)

我遇到了与select tag helper相同的问题,我尝试了很少的东西而且它有效。 试试这个 -

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

答案 1 :(得分:18)

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

答案 2 :(得分:7)

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

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

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

答案 3 :(得分: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"

将为每个textarea标记执行MyCustomTextAreaTextAreaTagHelper

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

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