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> |
它没有显示任何设计时错误,但呈现如下:
因此,文本区域将始终被禁用。
然后,我尝试(删除的):
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,则不呈现
1 | <textarea></textarea> |
如果为true,则
1 | <textarea disabled="disabled"></textarea> |
textarea标记帮助程序没有直接支持有条件地呈现禁用的文本区域。但是您始终可以扩展
因此,创建一个继承自
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); } } |
在
1 2 | @addTagHelper"*, Microsoft.AspNet.Mvc.TagHelpers" @addTagHelper"*,YourAssemblyNameHere" |
现在,在您的视图中,您可以像
1 2 | @model YourSomeViewModel <textarea asp-for="Doc" asp-is-disabled="Model.MustDisable"></textarea> |
其中
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" |
我没有注意到为textareas生成的输出有任何问题,但是我遇到了从其他默认标记帮助程序继承的问题。解决方案是删除_ViewImports.cshtml中的默认标记帮助器。
1 2 3 | @addTagHelper"*, Microsoft.AspNet.Mvc.TagHelpers" @addTagHelper"*,YourAssemblyNameHere" @removeTagHelper"Microsoft.AspNet.Mvc.TagHelpers.TextAreaTagHelper, Microsoft.AspNet.Mvc.TagHelpers" |