4


0

カスタムモデルバインダーのDataAnnotations検証

MVCプロジェクトでListのカスタムモデルバインダーを作成しましたが、このバインダーをDataAnnotations検証属性に対して検証する方法に固執しています。

インターウェブ上で同様のシナリオについて説明している投稿をいくつか見つけましたが、特定のシナリオで機能するものを見つけることができませんでした。

モデルバインダーコード:

    public class QuestionModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        List res = new List();
        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 options { get; set; }

}

RequiredIfTrue属性は、http://foolproof.codeplex.com/ [MVC Foolproof Validation]ライブラリからのものです。 どうやらそれは十分なほど簡単ではありません!

1 Answer


2


ここからの解決策は機能します。

https://stackoverflow.com/questions/5820637/custom-model-binding-model-state-and-data-annotations [カスタムモデルバインディング、モデル状態、データアノテーション]

CreateModelオプションにより、作業が非常に簡単になります。