4

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

我在interwebs上发现了一些关于类似场景的帖子,但是我一直无法找到适合我的特定场景的任何内容。

模型绑定代码:

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

} 

的RequiredIfTrue属性是从MVC Foolproof Validation库。显然它不够安全!

+1

你有没有想过如何做到这一点?我见过很多类似的解决方案,但都没有更新模型并使用DataAnnotations进行验证,并最终更新了ModelState。 – rycornell 2011-03-14 16:31:35

+0

不,我恐怕不是,结果证明我对模型的验证毕竟是没有必要的,所以我从来没有想过写一个修复程序。 – hermiod 2011-03-14 18:46:47

+0

[自定义模型绑定,模型状态和数据注释]的可能重复(http://stackoverflow.com/questions/5820637/custom-model-binding-model-state-and-data-annotations) – Gareth 2015-07-30 10:07:18

回答