ASP .NET核心输入标记助手不使用Razor代码
我想将输入标记助手与剃刀代码组合起来设置属性,但我不能让两种技术一起工作。 我只是试图根据视图模型属性的值在输入字段上设置disabled属性。
当我把剃刀代码放在asp-for
标签之后,剃刀智能感知器无法被识别,并且字段未按预期禁用…
渲染输出……
当我将剃刀代码放在asp-for
标签之前时,标签helper intellisense无法识别,并且该字段未按预期设置视图模型属性…
渲染输出……
请注意,如果剃刀代码位于类属性中,则组合标记帮助器和剃刀会起作用。 遗憾的是,输入字段需要disabled属性,而不是bootstrap 3的禁用类。
有没有办法让这项工作?
要呈现禁用的输入元素,只需添加禁用的属性即可。 以下所有内容将呈现禁用的输入文本元素。
在Asp.NET Core中,您可以扩展现有的输入标记帮助程序以创建只读输入标记帮助程序。
扩展InputTagHelper
类,添加一个新属性以标识是否应禁用输入,并根据此值将“disabled”属性添加到输入。
[HtmlTargetElement("input", Attributes = ForAttributeName)] public class MyCustomTextArea : InputTagHelper { 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) { var d = new TagHelperAttribute("disabled", "disabled"); output.Attributes.Add(d); } base.Process(context, output); } }
现在要使用这个自定义textarea助手,您需要在_ViewImports.cshtml
调用addTagHelper
方法。
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers @addTagHelper *, YourAssemblyNameHere
现在在您的视图中,您可以指定asp-is-disabled
属性值。
您可以像这样使用ASP Core标记助手:
然后为您的财产添加[可编辑(虚假)],如下所示:
[Editable(false)] public string Name {set;get;}
那么你应该扩展InputTagHelper:
[HtmlTargetElement("input", Attributes = ForAttributeName)] public class ExtendedInputTagHelper : InputTagHelper { private const string ForAttributeName = "asp-for"; public ExtendedInputTagHelper(IHtmlGenerator generator) : base(generator) { } public override void Process(TagHelperContext context, TagHelperOutput output) { var isContentModified = output.IsContentModified; if (For.Metadata.IsReadOnly) { var attribute = new TagHelperAttribute("disabled", "disabled"); output.Attributes.Add(attribute); } if (!isContentModified) { base.Process(context, output); } } }
最后在_ViewImports.cshtml中导入TagHelper:
@addTagHelper *,
该解决方案的优点是将逻辑放在模型中并保留MVC原则。
你最好做这样的事情:
@{ var isDisabled = ((Model.OtherDrugs == null) ? "disabled" : string.Empty()); }
然后
@Html.TextBox("OtherDrugs", "", new { isDisabled })
- 如何在ASP.NET Core Identity中注销其他用户
- 如何从.net核心IoC容器中删除默认服务?
- AspNet核心身份,如何设置options.Cookie.SameSite?
- ASP.NET Core Identity不会注入UserManager
- 使用特定的HttpMessageHandler注入单实例HttpClient
- 在Asp.net Core中设置CultureInfo有一个。 作为CurrencyDecimalSeparator而不是,
- 如何使用Entity Framework 7在代码中首先处理这两个模型?
- 持久保存到Azure表存储时使用POCO
- 访问ASP.NET Core控制器内的连接字符串