首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >输入标签助手不使用Razor代码

输入标签助手不使用Razor代码
EN

Stack Overflow用户
提问于 2016-11-08 13:04:18
回答 3查看 8.4K关注 0票数 8

我想将输入标记助手与剃刀代码组合起来,以设置属性,但我无法使这两种技术协同工作。我只是尝试根据视图模型属性的值在输入字段上设置禁用的属性。

当我将剃刀代码放在asp-for标记之后,剃刀智能感知就不会被识别,而且字段也不会像预期的那样被禁用.

代码语言:javascript
复制
<input asp-for="OtherDrugs" @((Model.OtherDrugs == null) ? "disabled" : "") class="form-control" />

渲染输出..。

代码语言:javascript
复制
<input type="text" id="OtherDrugs" name="OtherDrugs" value="" />

当我将剃须刀代码放在asp-for标记之前时,标签助手intellisense是不被识别的,并且字段没有像预期的那样使用视图模型属性来设置.

代码语言:javascript
复制
<input @((Model.OtherDrugs == null) ? "disabled" : "") asp-for="OtherDrug" class="form-control" />

渲染输出..。

代码语言:javascript
复制
<input disabled asp-for="OtherDrugs" class="form-control" />

注意,如果剃刀代码在一个类属性中,那么结合标记帮助器和剃须刀确实有效。不幸的是,输入字段需要禁用属性,而不是引导3.的禁用类。

有办法让这件事成功吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-11-08 14:38:12

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

代码语言:javascript
复制
<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核心中,您可以扩展现有的输入标记助手以创建只读输入标记助手。

扩展InputTagHelper类,添加一个新属性以确定是否应该禁用输入,并根据该值将“禁用”属性添加到输入中。

代码语言:javascript
复制
[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方法。

代码语言:javascript
复制
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@addTagHelper *, YourAssemblyNameHere

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

代码语言:javascript
复制
<input type="text" asp-for="OtherDrugs" 
                                  asp-is-disabled="@Model.OtherDrugs==null"/> 
票数 14
EN

Stack Overflow用户

发布于 2017-06-19 20:52:17

您可以使用ASP Core标记助手,如下所示:

代码语言:javascript
复制
<input asp-for="Name" />

然后对你的财产进行如下可编辑(假)的处理:

[Editable(false)] public string Name {set;get;}

然后您应该扩展InputTagHelper:

代码语言:javascript
复制
[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);
        }
    }
}

最后,在TagHelper中导入_ViewImports.cshtml:

代码语言:javascript
复制
@addTagHelper *, <your assembly name>

该解决方案的优点是在模型中加入逻辑,并保留MVC原则。

票数 1
EN

Stack Overflow用户

发布于 2019-03-01 05:17:35

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

代码语言:javascript
复制
@if (Model.OtherDrugs == null)
{
    <input asp-for="OtherDrug" disabled="disabled" class="form-control" />
}
else
{
    <input asp-for="OtherDrug" class="form-control" />
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40487688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档