我想启用或禁用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>
没有显示任何设计时间错误,但它呈现的与前一个相同。
我该如何以正确的方式实施?
答案 0 :(得分:33)
我遇到了与select tag helper相同的问题,我尝试了很少的东西而且它有效。 试试这个 -
<textarea asp-for="Doc" disabled="@(Model.MustDisable ? "disabled" : null)"></textarea>
&#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
具有Doc
和MustDisable
属性。
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标记执行MyCustomTextArea
和TextAreaTagHelper
。
我没有注意到为textareas生成的输出有任何问题,但我遇到了从其他默认标记助手继承的问题。解决方案是删除_ViewImports.cshtml中的默认标记帮助程序。
@addTagHelper "*, Microsoft.AspNet.Mvc.TagHelpers"
@addTagHelper "*,YourAssemblyNameHere"
@removeTagHelper "Microsoft.AspNet.Mvc.TagHelpers.TextAreaTagHelper, Microsoft.AspNet.Mvc.TagHelpers"