在工作中,我正在尝试创建一个流程,让用户动态创建一个表单,其他用户可以填写值。但我在如何使其与ASP MVC 3的内置模型绑定和验证兼容方面遇到了麻烦。
我们的视图模型设置类似于以下示例代码(请注意,我已经过度简化了示例代码):
我们的视图大致如下所示:
我希望我们能创建一个自定义的ModelValidatorProvider或ModelMetadataProvider类,能够分析FieldValue实例,确定其Field.IsRequired属性是否为true,然后将RequiredFieldValidator添加到该特定实例的验证器中。但我一直没有成功。似乎在ModelValidatorProvider(和ModelMetadataProvider)中无法访问父容器的值(即:GetValidators()将被调用以获取FieldValue.Value,但从那里无法获取FieldValue对象)。
我尝试过的事情:
- 在ModelValidatorProvider中,我尝试使用ControllerContext.Controller.ViewData.Model,但如果有嵌套类型,则无法正常工作。如果我正在尝试找出验证器Form.FieldValues[3],我不知道要使用哪个FieldValue。 - 我尝试使用自定义ModelMetadata,尝试使用内部modelAccessor的Target属性来获取父级,但如果有嵌套类型,则这也无法正常工作。在MVC的某个内部位置,像我的示例中的表达式将导致Target成为模型的类型(Form),而不是FieldValue。因此,我遇到了与上述相同的问题,即我不知道要与哪个FieldValue实例进行比较。 - 一个类级别的验证属性,我可以将其放在FieldValue类本身上,但这只在服务器验证期间调用。我也需要客户端验证。
在MVC中我正在尝试的事情是否可能?还是我完全错了什么?
我们的视图模型设置类似于以下示例代码(请注意,我已经过度简化了示例代码):
public class Form
{
public FieldValue[] FieldValues { get; set; }
}
public class Field
{
public bool IsRequired { get; set; }
}
public class FieldValue
{
public Field Field { get; set; }
public string Value { get; set; }
}
我们的视图大致如下所示:
@model Form
@using (Html.BeginForm("Create", "Form", FormMethod.Post))
{
@for(var i = 0; i < Model.Fields.Count(); i++)
{
@Html.TextBoxFor(_ => @Model.Fields[i].Value)
}
<input type="submit" value="Save" name="Submit" />
}
我希望我们能创建一个自定义的ModelValidatorProvider或ModelMetadataProvider类,能够分析FieldValue实例,确定其Field.IsRequired属性是否为true,然后将RequiredFieldValidator添加到该特定实例的验证器中。但我一直没有成功。似乎在ModelValidatorProvider(和ModelMetadataProvider)中无法访问父容器的值(即:GetValidators()将被调用以获取FieldValue.Value,但从那里无法获取FieldValue对象)。
我尝试过的事情:
- 在ModelValidatorProvider中,我尝试使用ControllerContext.Controller.ViewData.Model,但如果有嵌套类型,则无法正常工作。如果我正在尝试找出验证器Form.FieldValues[3],我不知道要使用哪个FieldValue。 - 我尝试使用自定义ModelMetadata,尝试使用内部modelAccessor的Target属性来获取父级,但如果有嵌套类型,则这也无法正常工作。在MVC的某个内部位置,像我的示例中的表达式将导致Target成为模型的类型(Form),而不是FieldValue。因此,我遇到了与上述相同的问题,即我不知道要与哪个FieldValue实例进行比较。 - 一个类级别的验证属性,我可以将其放在FieldValue类本身上,但这只在服务器验证期间调用。我也需要客户端验证。
在MVC中我正在尝试的事情是否可能?还是我完全错了什么?