我制作了一个自定义的ASP.NET Core TagHelper,它根据DataAnnotations-Attributes添加了对parsley的验证。例如,[Required]
属性将为输入字段生成required=""
。这很好,但只在第一级属性。但我还需要验证子实体的自定义属性。
一个简短的例子:
public class ModelA{
[Required]
public string Test{get;set;}
public ModelB ModelB{get;set;}
}
public class ModelB{
[Required]
public string AnotherTest{get;set;}
}
当我像<input asp-for="Test" />
一样访问模型A的属性时,它工作正常,但像<input asp-for="ModelB.AnotherTest" />
这样的子实体不会触发我的TagHelper的Process
方法
public class MyValidator:InputTagHelper{
[HtmlAttributeName("parsley-validation")]
public bool ParsleyValidation { get; set; }
public override void Process(TagHelperContext context, TagHelperOutput output){
if(ParsleyValidation){
output.Attributes.Add("required", null);
}
}
}
使用反射在这里不起作用,因为我需要属性的TagHelperOutput
实例。但是当我使用反射自己遍历子类的属性时,我没有得到这个。
答案 0 :(得分:0)
找到解决方案:我犯了一个逻辑错误。在Process
方法中,我遍历了模型的每个属性。这并没有多大意义,因为这个方法是针对每个属性触发的。这个循环会导致TagHelperOutput
出现问题:该实例仅适用于当前属性。因此,当我遍历它们时,当我为属性Y执行某些操作时,将为属性X调用该方法。
当然,ASP.NET Core也会为子实体激活Process
方法。就我而言,子实体中缺少parsley-validation
。结果,我的代码被执行了(如果声明)。愚蠢的错误,但现在一切都有效并且有意义。问题是obsolet因为TagHelper在你知道如何正确使用它们时正常工作。