【问题标题】:.NET Core required field indicator.NET Core 必填字段指示器
【发布时间】:2017-02-11 18:52:58
【问题描述】:

这适用于 ASP.NET MVC Core 1.1 Web 应用程序。

我想要一种为模型中设置了 [Required] 属性的字段显示必填字段指示符(如标签后的红色 *)的好方法。

目前我使用 LabelTagHelper 在表单上添加了标签,如下所示:

<label asp-for="Surname" class="required"></label>

我有一些 CSS 会根据“必需”类的存在在我的标签后添加 * 符号:

label.required:after {
    color: #A94442;
    content: ' *';
    display:inline;
}

这行得通。但是当然,如​​果我更改我的模型并为字段添加或删除 [Required] 属性,我必须确保我手动转到标记并进行相应的更改,为相关标签添加或删除“必需”类.

谁能帮助我以一种优雅的方式根据模型上 [Required] 属性的存在将“必需”类添加到标签中,而不必将其硬编码到 cshtml 中?

也许是一个继承自 LabelTagHelper 的自定义标签助手?并使用反射查看[Required]属性是否在model字段中?

或者有没有更好的方法?

【问题讨论】:

  • 有帮助吗?如果是,您能否将答案设为已解决?

标签: asp.net-core required asp.net-core-tag-helpers


【解决方案1】:

您可以创建一个专用的 TagHelper 来实现此目的:

[HtmlTargetElement("label", Attributes = ForAttributeName)]
public class RequiredTagHelper : TagHelper
{
    private const string ForAttributeName = "asp-for";

    [HtmlAttributeName(ForAttributeName)]
    public ModelExpression For { get; set; }

    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        if (context == null)
            throw new ArgumentNullException(nameof(context));

        if (output == null)
            throw new ArgumentNullException(nameof(output));

        if (For.Metadata.IsRequired)
        {
            var existingClass = output.Attributes.FirstOrDefault(f => f.Name == "class");
            var cssClass = string.Empty;
            if (existingClass != null)
            {
                cssClass = $"{existingClass.Value} ";
            }

            cssClass += "required";
            output.Attributes.SetAttribute("class", cssClass);
        }
    }
}

【讨论】:

  • 正如 Joao 所说,您应该在尝试删除现有类之前检查它是否为 null cs if(existingClass != null) { output.Attributes.Remove(existingClass); }
  • 感谢您的提醒,我已经编辑了我的答案。我现在使用 .SetAttribute 方法来做同样的事情,而不是删除然后添加类属性。
  • 我们应该如何使用它?一个简短的例子会很酷
  • @Serge 你的模型类(通过@model 指令注入到你的视图中)应该有一个带有[Required] 属性的属性,然后在你的视图中:&lt;label asp-for="@Model.MyRequiredField"&gt;&lt;/label&gt;
  • @Métoule 看我的版本,继承自 LabelTagHelper 在这个 OP 的末尾 stackoverflow.com/q/66256829/961631
【解决方案2】:

建议:

而不仅仅是output.Attributes.Remove(existingClass);,如果标签没有属性“class”,可能会进行一些验证:

if(existingClass != null)
{
     output.Attributes.Remove(existingClass);
}   

【讨论】:

  • 欢迎来到 Stack Overflow!这似乎是对the accepted answer 的评论,而不是直接的答案。建议替代已经提供的解决方案并没有错,但editing your answer 使其更加独立将提高您的帖子质量,并使其不太可能被否决或删除。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-03
  • 1970-01-01
  • 1970-01-01
  • 2019-03-01
  • 2013-03-23
相关资源
最近更新 更多