自定义 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)
}
}
我有以下内容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)
}
}