我正在通过在类级别附加到模型的模型验证器执行一些模型验证.如果我发现错误,我需要能够将该错误附加到视图中的相关字段,以便可以向用户清楚地显示.
但是,只需将memberNames传递给ValidationResult就不会做任何事情.相反,我发现我需要在控制器中重新验证,然后填充ModelState对象.
这是代码:
public class CompletedMilestoneInCorrectOrderAttribute : ValidationAttribute
{
private const string DefaultErrorMessage = "Milestones cannot be completed out of sequence";
public CompletedMilestoneInCorrectOrderAttribute()
: base(DefaultErrorMessage)
{
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var model = (RevisionEditViewModel)validationContext.ObjectInstance;
var previousCompleted = true;
var loop = 0;
var members = new List<string>();
foreach (var rm in model.RevisionMilestones)
{
if (rm.Completed && !previousCompleted)
{
members.Add("revisionMilestones[" + loop + "].ExpectedCompletionDate");
members.Add("revisionMilestones[" + loop + "].Completed");
}
if (!rm.NotApplicable)
{
previousCompleted = rm.Completed;
}
loop++;
}
if (members.Any())
{
return new ValidationResult(DefaultErrorMessage, members);
}
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
并在控制器中
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(RevisionEditViewModel model)
{
//without this code the error never gets attached to the correct field in the view
var validationContext = new ValidationContext(model, null, null);
var validationResults = new List<ValidationResult>();
Validator.TryValidateObject(model, validationContext, validationResults);
foreach (var validationResult in validationResults)
{
foreach (var memberName in validationResult.MemberNames)
{
ModelState.AddModelError(memberName, validationResult.ErrorMessage);
}
}
if (ModelState.IsValid)
{
*snip*
}
else
{
*snip*
}
}
Run Code Online (Sandbox Code Playgroud)
有谁知道发生了什么?如何更正它,以便不再需要控制器中的混乱代码?
干杯迈克
| 归档时间: |
|
| 查看次数: |
1427 次 |
| 最近记录: |