在自定义模型绑定DataAnnotations验证
-
26-09-2019 - |
题
我在我的MVC项目编写了目录自定义模型粘结剂但是我现在停留在如何让这种粘合剂来验证我的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防呆验证库。显然这是不太够万无一失!
解决方案
不隶属于 StackOverflow