Razor asp.net有条件地禁用标记帮助程序(textarea)
我想根据从模型中评估的条件启用或禁用textarea,并且我正在使用textarea标记帮助器。 换句话说,类似这样的事情:Razor asp.net有条件地禁用标记帮助程序(textarea),razor,asp.net-core-mvc,tag-helpers,Razor,Asp.net Core Mvc,Tag Helpers,我想根据从模型中评估的条件启用或禁用textarea,并且我正在使用textarea标记帮助器。 换句话说,类似这样的事情: <textarea asp-for="Doc" @(Model.MustDisable ? "disabled" : "")></textarea> 它没有显示任何设计时错误,但渲染结果与前一个相同 如何以正确的方式实现此功能?textarea标记辅助程序不直接支持有条件地呈现禁用的文本区域。但您始终可以扩展TextAreaTagHelper并添
<textarea asp-for="Doc" @(Model.MustDisable ? "disabled" : "")></textarea>
它没有显示任何设计时错误,但渲染结果与前一个相同
如何以正确的方式实现此功能?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);
}
}
在您的\u ViewImports.cshtml
文件中,使用@addTagHelper
指令,指定定义上述类的程序集,以便在其他视图中可以使用我们的新标记helper
@addTagHelper "*, Microsoft.AspNet.Mvc.TagHelpers"
@addTagHelper "*,YourAssemblyNameHere"
现在在您的视图中,您可以像
@model YourSomeViewModel
<textarea asp-for="Doc" asp-is-disabled="Model.MustDisable"></textarea>
我单独发布这篇文章,因为我没有足够的声誉给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"
我在使用selecttaghelper时也遇到了同样的问题,我尝试了几件事情,结果都成功了。 试试这个-
实际上非常简单,disable属性已经按照您的需要工作了-您可以传入一个布尔值:
<textarea asp-for="Doc" disabled="@Model.MustDisable"></textarea>
如果为true,则disabled
属性设置为“disabled”:
为什么不也有条件地呈现disabled属性呢?我不认为这在所有浏览器上都适用disabled=“”将导致输入被禁用。@user942620您是对的,但只是在使用“”而不是nullThis的情况下!!!谢谢!我仍然想知道为什么MS不允许常规@(条件?“禁用”:“”),但我打算扩展TagHelper(对于这样一个小东西来说太多工作了!),而这个解决方案节省了我的时间!;)@removeTagHelper Microsoft.AspNetCore.Mvc.TagHelpers.InputTagHelper,Microsoft.AspNetCore.Mvc.TagHelpers比最上面投票的答案效果更好,也比使用三元表达式添加禁用属性要好一些。谢谢为什么投票结果没有提高?这是一个完美的、雄辩的、可能是最“正确”的解决方案。@RyanO'Neill这就是它的工作原理!尝试一下,您将看到:-)。如果您发送false,TagHelper将根本不会打印属性。我也会更新我的答案以澄清。@Jess-这是一个内置的Tag Helper(我不知道是否可以称之为magic)哇,magic。在核心3.1中确认-这应该是可接受的答案。@vmh请接受这一答案。它按预期工作,在传递值false
时,不会呈现disabled
属性。
@addTagHelper "*, Microsoft.AspNet.Mvc.TagHelpers"
@addTagHelper "*,YourAssemblyNameHere"
@addTagHelper "*, Microsoft.AspNet.Mvc.TagHelpers"
@addTagHelper "*,YourAssemblyNameHere"
@removeTagHelper "Microsoft.AspNet.Mvc.TagHelpers.TextAreaTagHelper, Microsoft.AspNet.Mvc.TagHelpers"
<textarea asp-for="Doc" disabled="@Model.MustDisable"></textarea>
<textarea></textarea>
<textarea disabled="disabled"></textarea>