4

J'ai écrit un classeur de modèle personnalisé pour List dans mon projet MVC, mais je suis maintenant bloqué sur la manière de valider ce classeur par rapport à mes attributs de validation DataAnnotations.Validation de DataAnnotations dans le classeur de modèle personnalisé

J'ai trouvé quelques messages sur les interwebs qui parlent de scénarios similaires, mais je n'ai pas été en mesure de trouver quelque chose qui fonctionne pour mon scénario particulier.

Code modèle Binder:

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

} 

Mon modèle MetaData:

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

} 

L'attribut RequiredIfTrue est de la bibliothèque MVC Foolproof Validation. Apparemment ce n'est pas assez infaillible!

+1

Avez-vous déjà trouvé comment faire? J'ai vu beaucoup de solutions similaires, mais aucune qui met à jour le modèle et valide en utilisant les DataAnnotations, et finalement met à jour le ModelState. – rycornell

+0

Non, je n'ai pas peur, il s'est avéré que la validation que j'avais sur le modèle n'était pas nécessaire après tout, donc je ne me suis jamais mis à écrire un correctif. – hermiod

+0

duplication possible de [liaison de modèle personnalisé, état du modèle et annotations de données] (http://stackoverflow.com/questions/5820637/custom-model-binding-model-state-and-data-annotations) – Gareth

Répondre