访问自定义ASP.NET Core TagHelper中的递归属性以修改其HTML

时间:2016-11-26 15:20:09

标签: c# asp.net-core asp.net-core-mvc asp.net-core-1.0

我制作了一个自定义的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实例。但是当我使用反射自己遍历子类的属性时,我没有得到这个。

1 个答案:

答案 0 :(得分:0)

找到解决方案:我犯了一个逻辑错误。在Process方法中,我遍历了模型的每个属性。这并没有多大意义,因为这个方法是针对每个属性触发的。这个循环会导致TagHelperOutput出现问题:该实例仅适用于当前属性。因此,当我遍历它们时,当我为属性Y执行某些操作时,将为属性X调用该方法。

当然,ASP.NET Core也会为子实体激活Process方法。就我而言,子实体中缺少parsley-validation。结果,我的代码被执行了(如果声明)。愚蠢的错误,但现在一切都有效并且有意义。问题是obsolet因为TagHelper在你知道如何正确使用它们时正常工作。