自定义ModelValidatorProvider - 访问容器类型属性

时间:2015-11-20 10:12:59

标签: c# asp.net-mvc asp.net-mvc-3 asp.net-mvc-4

我有以下课程(简化问题)

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

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

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);
     }
   }
}

某些字段值需要验证。阅读了一下,我希望用Custom ModelValidatorProvider做这个,但这似乎只为我提供了我试图绑定的属性的详细信息,以及整个页面对象模型(下面的示例代码)< / p>

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,但我似乎无法得到任何值 - 我可以获取容器值,但这会返回带有所有字段的MyPageData.cs,所以我只能通过它来匹配它值。

任何想法?

1 个答案:

答案 0 :(得分:0)

原来我问了一个错误的问题。

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

Data.cshtml
{
   @model MyPageData

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