自定义 ModelValidatorProvider - 获取对 containertype 属性 的访问权限

Custom ModelValidatorProvider - get access to containertype property

我有以下内容class(针对问题进行了简化)

MyPageData.cs
{
    string PageName {get;set;}
    List<Field> Fields {get;set;}
}

其中包含另一个集合class(供用户输入的字段)。

Field.cs
{
     string Id {get;set;}
     object Value {get;set;}
}

并以如下方式绑定到视图

Data.cshtml
{
   @model MyPageData

   @using(Html.BeginForm())
   {
     @foreach(var field in fieldsData)
     {
          var index = MyPage.Fields.IndexOf(field);
          @Html.TextBoxFor(t => t.MyPage.Fields[index].Value);
     }
   }
}

部分字段值需要验证。阅读了一些内容后,我希望使用自定义 ModelValidatorProvider 来执行此操作,但这似乎只为我提供了我试图绑定的 属性 的详细信息,以及整个页面对象模型(示例下面的代码)

public class CustomModelValidatorProvider : DataAnnotationsModelValidatorProvider
{
      protected override IEnumerable GetValidators(ModelMetadata metadata, ControllerContext context, IEnumerable attributes)
        {
            if(metadata.PropertyName == "Value" && metadata.ContainerType == typeof(Field))
{
    var id = **Some magic to work out the id of the Field that this value property is set for;**
    once we have the id then we can work out what validators to apply 
}            

            return base.GetValidators(metadata, context, attributes);
        }
}

所以我遇到的问题是确定这个 'Value' 属性 是为哪个字段设置的。容器类型显示为 Field.cs,但我似乎无法为此获取任何值 - 我可以获取容器值,但是此 returns MyPageData.cs 包含所有字段,所以我只能按价值匹配它。

有什么想法吗?

原来我问错了问题。

我通过将我的 Data.cshtml 视图更改为编辑器来解决这个问题 - 然后编辑器视图的容器中有我的项目和 ID。

Data.cshtml
{
   @model MyPageData

   @using(Html.BeginForm())
   {
     @Html.EditorFor(f => f.MyPage.Fields)
   }
}