MVC Core 5 中子属性的客户端验证

问题描述

在我的 ASP.NET MVC 5 (C#) 应用程序中,我有一个名为 Name 的类:

public class Name
{
    public virtual string? First { get; set; }
    public virtual string? Middle { get; set; }
    public virtual string? Last { get; set; }
    public virtual string? Suffix { get; set; }
}

我还有几个模型包含一个名为 NameFull 的属性(类型名称):

[RequiredProps(nameof(Name.First),nameof(Name.Last))] // *** More about this in a minute. ***
public Name? NameFull { get; set; }

这些模型属性由自定义标签助手使用,如下所示:<field asp-for="NameFull" />。自定义标签助手内部的逻辑会检测到模型属性是复杂类型和 generates a custom HTML helper,因为 HTML 助手可以 handle complex objects unlike tag helpers。所以基本上这段代码 <field asp-for="NameFull" /> 生成多个输入元素。这是背景,这是我的问题...


我希望能够根据具体情况制作一些所需的输入。所以也许在一个模型中需要姓和名。在另一个模型中,它们都不是必需的。所以我创建了一个名为 RequiredPropsAttribute 的自定义属性(参见上面的模型示例)。它继承自 ValidationAttribute 并像这样实现 IClientModelValidator AttributeAdapter to apply client-side validation

public sealed class RequiredPropsAttribute : ValidationAttribute,IClientModelValidator
{
    //most of the logic has been omitted for brevity...
    public void AddValidation(ClientModelValidationContext context)
    {
        var properties = context.ModelMetadata.Properties;
        if (!context.Attributes.ContainsKey("data-val"))
        {
            context.Attributes.Add("data-val","true");
        }
        if (!context.Attributes.ContainsKey("data-val-required"))
        {
            context.Attributes.Add("data-val-required",$"The {string.Join(",",properties)} fields are all required.");
        }
    }
}

这确实允许我向父属性(名称)添加验证,但我想要的是将验证应用于其嵌套的子项。简而言之,我想要类似于上面的代码,将 data-val="true"data-val-required="This field is required" 注入嵌套的子输入(Name.First、Name.Middle、Name.Last、Name.Suffix)。我曾尝试使用 context.ModelMetadata.Properties 访问子项,但集合的设置方式无法让我可以编写如下代码:property.Attributes.Add("data-val","true")。这引出了我的问题...

问题:我如何在 AddValidation 中编写逻辑,让我基本上可以说:遍历 Name 的子属性并向每个子属性添加属性,以便每个子 <input> 获得 data- 验证属性。这可能吗?如果没有,是否还有其他方法可以根据应用于名称的属性有条件地向名称属性添加必需的属性,例如向 First 添加一个 RequiredIf ,表示“如果 Name 具有包含 First 的 RequiredProps 属性,则 make first required 等?

提前感谢大家的帮助!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...