Validation 自定义模型绑定器中的DataAnnotations验证

Validation 自定义模型绑定器中的DataAnnotations验证,validation,asp.net-mvc-2,data-annotations,custom-model-binder,Validation,Asp.net Mvc 2,Data Annotations,Custom Model Binder,在我的MVC项目中,我已经为列表编写了一个自定义模型绑定器,但是我现在陷入了如何让这个绑定器根据我的DataAnnotations验证属性进行验证的困境 我在互联网站上找到了一些关于类似场景的帖子,但我没有找到任何适合我的特定场景的帖子 型号活页夹代码: public class QuestionModelBinder : IModelBinder { public object BindModel(ControllerContext controllerContext, Mod

在我的MVC项目中,我已经为列表编写了一个自定义模型绑定器,但是我现在陷入了如何让这个绑定器根据我的DataAnnotations验证属性进行验证的困境

我在互联网站上找到了一些关于类似场景的帖子,但我没有找到任何适合我的特定场景的帖子

型号活页夹代码:

    public class QuestionModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        List<QuestionEditModel> res = new List<QuestionEditModel>();
        var form = controllerContext.HttpContext.Request.Form;
        int i = 0;
        while (!string.IsNullOrEmpty(form["Questions[" + i + "].QuestionID"]))
        {
            var p = new QuestionEditModel();
            p.QuestionID = form["Questions[" + i + "].QuestionID"];
            p.Answer = form["Questions[" + i + "].Answer"];
            p.AnswerRequired = (form["Questions[" + i + "].AnswerRequired"] == "True") ? true : false;
            p.completedBy = form["Questions[" + i + "].completedBy"];
            p.completedOn=NullableParser.ParseNullableDateTime(form["Questions[" + i + "].CompletedOn"]);
            p.DefaultText = form["Questions[" + i + "].DefaultText"];
            p.EntryType = form["Questions[" + i + "].EntryType"];
            p.HelpText = form["Questions[" + i + "].HelpText"];
            p.OptionRequired = (form["Questions[" + i + "].OptionRequired"] == "True") ? true : false;
            p.OptionValue = NullableParser.ParseNullableInt(form["Questions[" + i + "].OptionValue"]);
            p.QuestionName = form["Questions[" + i + "].QuestionName"];
            p.QuestionText = form["Questions[" + i + "].QuestionText"];
            res.Add(p);
            i++;
        }

        return res;
    }

    private bool HasGenericTypeBase(System.Type type, System.Type genericType)
    {
    while (type != typeof(object))
    {
        if (type.IsGenericType && type.GetGenericTypeDefinition() == genericType) return true;
        type = type.BaseType;
    }

    return false;        
    }

}
    [MetadataType(typeof(QuestionEditModelMetaData))]
public partial class QuestionEditModel { }


public class QuestionEditModelMetaData
{
    [Required]
    public string QuestionID { get; set; }
    [Required]
    public string QuestionName { get; set; }
    [Required]
    public string QuestionText { get; set; }
    [Required]
    public string DefaultText { get; set; }
    [Required]
    public string EntryType { get; set; }
    [Required]
    public string HelpText { get; set; }

    public Boolean AnswerRequired { get; set; }
    public Boolean OptionRequired { get; set; }

    //[RequiredIfTrue("AnswerRequired")]
    [Required]
    public string Answer { get; set; }

    [RequiredIfTrue("OptionRequired")]
    public int? OptionValue { get; set; }

    public string completedBy { get; set; }
    public DateTime? completedOn { get; set; }

    public List<Option> options { get; set; }

}
公共类问题模型绑定器:IModelBinder
{
公共对象绑定模型(ControllerContext ControllerContext,ModelBindingContext bindingContext)
{
List res=新列表();
var form=controllerContext.HttpContext.Request.form;
int i=0;
而(!string.IsNullOrEmpty(形式[“问题[”+i+“].QuestionID]”)
{
var p=新的QuestionEditModel();
p、 QuestionID=表格[“问题[“+i+”]。QuestionID];
p、 答案=表格[“问题[“+i+”]。答案“];
p、 AnswerRequired=(表格[“问题[”+i+“]。AnswerRequired”]=“正确”)?正确:错误;
p、 填空人=表格[“问题[“+i+”]。填空人“];
p、 completedOn=NullableParser.parsenullableddatetime(形式为[“问题[”+i+“].completedOn]);
p、 DefaultText=表格[“问题[“+i+”]。DefaultText”];
p、 EntryType=表格[“问题[”+i+“].EntryType];
p、 HelpText=表格[“问题[”+i+“].HelpText];
p、 OptionRequired=(表格[“问题[”+i+“]。OptionRequired”]=“正确”)?正确:错误;
p、 OptionValue=NullableParser.ParseNullableInt(形式为[“问题[”+i+“].OptionValue]);
p、 QuestionName=表格[“问题[”+i+“].QuestionName];
p、 QuestionText=表格[“问题[“+i+”]。QuestionText”];
决议增补(p);
i++;
}
返回res;
}
私有bool HasGenericTypeBase(System.Type类型,System.Type genericType)
{
while(type!=typeof(object))
{
if(type.IsGenericType&&type.GetGenericTypeDefinition()==genericType)返回true;
type=type.BaseType;
}
返回false;
}
}
我的模型元数据:

    public class QuestionModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        List<QuestionEditModel> res = new List<QuestionEditModel>();
        var form = controllerContext.HttpContext.Request.Form;
        int i = 0;
        while (!string.IsNullOrEmpty(form["Questions[" + i + "].QuestionID"]))
        {
            var p = new QuestionEditModel();
            p.QuestionID = form["Questions[" + i + "].QuestionID"];
            p.Answer = form["Questions[" + i + "].Answer"];
            p.AnswerRequired = (form["Questions[" + i + "].AnswerRequired"] == "True") ? true : false;
            p.completedBy = form["Questions[" + i + "].completedBy"];
            p.completedOn=NullableParser.ParseNullableDateTime(form["Questions[" + i + "].CompletedOn"]);
            p.DefaultText = form["Questions[" + i + "].DefaultText"];
            p.EntryType = form["Questions[" + i + "].EntryType"];
            p.HelpText = form["Questions[" + i + "].HelpText"];
            p.OptionRequired = (form["Questions[" + i + "].OptionRequired"] == "True") ? true : false;
            p.OptionValue = NullableParser.ParseNullableInt(form["Questions[" + i + "].OptionValue"]);
            p.QuestionName = form["Questions[" + i + "].QuestionName"];
            p.QuestionText = form["Questions[" + i + "].QuestionText"];
            res.Add(p);
            i++;
        }

        return res;
    }

    private bool HasGenericTypeBase(System.Type type, System.Type genericType)
    {
    while (type != typeof(object))
    {
        if (type.IsGenericType && type.GetGenericTypeDefinition() == genericType) return true;
        type = type.BaseType;
    }

    return false;        
    }

}
    [MetadataType(typeof(QuestionEditModelMetaData))]
public partial class QuestionEditModel { }


public class QuestionEditModelMetaData
{
    [Required]
    public string QuestionID { get; set; }
    [Required]
    public string QuestionName { get; set; }
    [Required]
    public string QuestionText { get; set; }
    [Required]
    public string DefaultText { get; set; }
    [Required]
    public string EntryType { get; set; }
    [Required]
    public string HelpText { get; set; }

    public Boolean AnswerRequired { get; set; }
    public Boolean OptionRequired { get; set; }

    //[RequiredIfTrue("AnswerRequired")]
    [Required]
    public string Answer { get; set; }

    [RequiredIfTrue("OptionRequired")]
    public int? OptionValue { get; set; }

    public string completedBy { get; set; }
    public DateTime? completedOn { get; set; }

    public List<Option> options { get; set; }

}
[MetadataType(typeof(QuestionEditModelMetaData))]
公共部分类QuestionEditModel{}
公共类QuestionEditModelMetaData
{
[必需]
公共字符串QuestionID{get;set;}
[必需]
公共字符串QuestionName{get;set;}
[必需]
公共字符串QuestionText{get;set;}
[必需]
公共字符串DefaultText{get;set;}
[必需]
公共字符串入口类型{get;set;}
[必需]
公共字符串HelpText{get;set;}
需要公共布尔应答{get;set;}
公共布尔选项必需{get;set;}
//[需要回答(“需要回答”)]
[必需]
公共字符串答案{get;set;}
[要求真实(“要求选择”)]
公共int?选项值{get;set;}
由{get;set;}完成的公共字符串
公共日期时间?在{get;set;}上完成
公共列表选项{get;set;}
}

requireditrue属性来自库。显然这还不够简单

这里的解决方案有效


CreateModel选项让生活变得非常简单。

你知道怎么做吗?我见过很多类似的解决方案,但没有一个更新模型并使用DataAnnotation进行验证,最终更新ModelState。不,恐怕没有,结果证明我对模型进行的验证毕竟是不必要的,所以我从来没有抽出时间来写修复程序。可能会重复标记作为答案,因为,如果我还需要这个,那就完美地回答了。