我有以下课程(简化问题)
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,所以我只能通过它来匹配它值。
任何想法?
答案 0 :(得分:0)
原来我问了一个错误的问题。
我通过将我的Data.cshtml视图更改为编辑器来解决这个问题 - 然后编辑器视图的容器将我的项目包含在Id中。
Data.cshtml
{
@model MyPageData
@using(Html.BeginForm())
{
@Html.EditorFor(f => f.MyPage.Fields)
}
}