输入标签助手不适用于 Razor 代码
Input Tag Helper Not Working with Razor Code
我想结合输入标签助手和剃刀代码来设置属性,但我无法让这两种技术一起工作。我只是想根据视图模型 属性.
的值在输入字段上设置禁用属性
当我将 razor 代码放在 asp-for
标记之后时,razor intellisense 无法识别并且字段未按预期禁用...
<input asp-for="OtherDrugs" @((Model.OtherDrugs == null) ? "disabled" : "") class="form-control" />
渲染输出...
<input type="text" id="OtherDrugs" name="OtherDrugs" value="" />
当我将 razor 代码放在 asp-for
标签之前时,标签助手 intellisense 无法识别,并且字段未按预期设置视图模型属性...
<input @((Model.OtherDrugs == null) ? "disabled" : "") asp-for="OtherDrug" class="form-control" />
渲染输出...
<input disabled asp-for="OtherDrugs" class="form-control" />
请注意,如果 razor 代码位于 class 属性内,则结合使用标签助手和 razor 确实有效。不幸的是,输入字段需要 disabled 属性而不是 disabled class for bootstrap 3.
有没有办法让它工作?
要呈现禁用的输入元素,您只需添加一个禁用属性。以下所有内容都会呈现禁用的输入文本元素。
<input type="checkbox" disabled />
<input type="checkbox" disabled="disabled" />
<input type="checkbox" disabled="false" />
<input type="checkbox" disabled="no" />
<input type="checkbox" disabled="enabled" />
<input type="checkbox" disabled="why is it still disabled" />
在 Asp.NET Core 中,您可以扩展现有的输入标签助手来创建只读输入标签助手。
扩展 InputTagHelper
class,添加一个新的 属性 来标识是否应禁用输入,并根据此值添加 "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);
}
}
现在要使用这个自定义文本区域助手,您需要调用 _ViewImports.cshtml
中的 addTagHelper
方法。
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@addTagHelper *, YourAssemblyNameHere
现在在您的视图中,您可以指定 asp-is-disabled
属性值。
<input type="text" asp-for="OtherDrugs"
asp-is-disabled="@Model.OtherDrugs==null"/>
您可以像这样使用 ASP 核心标签助手:
<input asp-for="Name" />
然后像这样为您的 属性 放置 [Editable(false)]:
[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 *, <your assembly name>
这种解决方案的优点是将逻辑放在模型中并保留 MVC 原则。
对我来说,TagHelper 扩展有点矫枉过正,因为根据某些模型值,我只需要两个输入 disabled/enabled。
因此我选择了最简单的(可能不是最好的)方法 - @if/else.
@if (Model.OtherDrugs == null)
{
<input asp-for="OtherDrug" disabled="disabled" class="form-control" />
}
else
{
<input asp-for="OtherDrug" class="form-control" />
}
我想结合输入标签助手和剃刀代码来设置属性,但我无法让这两种技术一起工作。我只是想根据视图模型 属性.
的值在输入字段上设置禁用属性当我将 razor 代码放在 asp-for
标记之后时,razor intellisense 无法识别并且字段未按预期禁用...
<input asp-for="OtherDrugs" @((Model.OtherDrugs == null) ? "disabled" : "") class="form-control" />
渲染输出...
<input type="text" id="OtherDrugs" name="OtherDrugs" value="" />
当我将 razor 代码放在 asp-for
标签之前时,标签助手 intellisense 无法识别,并且字段未按预期设置视图模型属性...
<input @((Model.OtherDrugs == null) ? "disabled" : "") asp-for="OtherDrug" class="form-control" />
渲染输出...
<input disabled asp-for="OtherDrugs" class="form-control" />
请注意,如果 razor 代码位于 class 属性内,则结合使用标签助手和 razor 确实有效。不幸的是,输入字段需要 disabled 属性而不是 disabled class for bootstrap 3.
有没有办法让它工作?
要呈现禁用的输入元素,您只需添加一个禁用属性。以下所有内容都会呈现禁用的输入文本元素。
<input type="checkbox" disabled />
<input type="checkbox" disabled="disabled" />
<input type="checkbox" disabled="false" />
<input type="checkbox" disabled="no" />
<input type="checkbox" disabled="enabled" />
<input type="checkbox" disabled="why is it still disabled" />
在 Asp.NET Core 中,您可以扩展现有的输入标签助手来创建只读输入标签助手。
扩展 InputTagHelper
class,添加一个新的 属性 来标识是否应禁用输入,并根据此值添加 "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);
}
}
现在要使用这个自定义文本区域助手,您需要调用 _ViewImports.cshtml
中的 addTagHelper
方法。
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@addTagHelper *, YourAssemblyNameHere
现在在您的视图中,您可以指定 asp-is-disabled
属性值。
<input type="text" asp-for="OtherDrugs"
asp-is-disabled="@Model.OtherDrugs==null"/>
您可以像这样使用 ASP 核心标签助手:
<input asp-for="Name" />
然后像这样为您的 属性 放置 [Editable(false)]:
[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 *, <your assembly name>
这种解决方案的优点是将逻辑放在模型中并保留 MVC 原则。
对我来说,TagHelper 扩展有点矫枉过正,因为根据某些模型值,我只需要两个输入 disabled/enabled。 因此我选择了最简单的(可能不是最好的)方法 - @if/else.
@if (Model.OtherDrugs == null)
{
<input asp-for="OtherDrug" disabled="disabled" class="form-control" />
}
else
{
<input asp-for="OtherDrug" class="form-control" />
}