输入标记助手不使用Razor代码

时间:2016-11-08 13:04:18

标签: c# razor asp.net-core asp.net-core-tag-helpers

我想将输入标记帮助器与剃刀代码组合起来设置属性,但我不能让两种技术一起工作。我只是试图根据视图模型属性的值在输入字段上设置disabled属性。

当我将剃刀代码放在asp-for标签之后,无法识别剃刀智能感知并且字段未按预期禁用...

<input asp-for="OtherDrugs" @((Model.OtherDrugs == null) ? "disabled" : "") class="form-control" />

渲染输出......

<input type="text" id="OtherDrugs" name="OtherDrugs" value="" />

当我将剃刀代码放在asp-for标记之前时,无法识别标记帮助程序intellisense,并且未按预期使用视图模型属性设置该字段...

<input @((Model.OtherDrugs == null) ? "disabled" : "") asp-for="OtherDrug" class="form-control" />

渲染输出......

<input disabled asp-for="OtherDrugs" class="form-control" />

请注意,如果剃刀代码位于类属性中,则组合标记帮助器和剃刀会起作用。遗憾的是,输入字段需要disabled属性,而不是bootstrap 3的禁用类。

有没有办法让这项工作?

3 个答案:

答案 0 :(得分:13)

要渲染已禁用的输入元素,只需添加已禁用的属性即可。以下所有内容都将呈现禁用的输入文本元素。

<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类,添加一个新属性以确定是否应禁用输入,并根据此值,将“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助手,您需要在addTagHelper中调用_ViewImports.cshtml方法。

@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@addTagHelper *, YourAssemblyNameHere

现在,在您的视图中,您可以指定asp-is-disabled属性值。

<input type="text" asp-for="OtherDrugs" 
                                  asp-is-disabled="@Model.OtherDrugs==null"/> 

答案 1 :(得分:1)

您可以像这样使用ASP Core标记助手:

<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原则。

答案 2 :(得分:0)

对我来说,TagHelper扩展是一个过大的功能,因为根据某些模型值,我只需要禁用/启用两个输入即可。 因此,我选择了最简单的方法(可能不是最好的方法)-@ if / else。

@if (Model.OtherDrugs == null)
{
    <input asp-for="OtherDrug" disabled="disabled" class="form-control" />
}
else
{
    <input asp-for="OtherDrug" class="form-control" />
}