Asp.net mvc 5 ValidationResult中的MemberName未按预期工作
我通过在类级别连接到模型的模型验证器执行一些模型验证。如果我发现一个错误,我需要能够将该错误附加到视图中的相关字段,以便可以清楚地向用户显示 但是,简单地将MemberName传递给ValidationResult并没有任何作用。相反,我发现我需要在控制器中重新验证,以便随后填充ModelState对象 代码如下:Asp.net mvc 5 ValidationResult中的MemberName未按预期工作,asp.net-mvc-5,Asp.net Mvc 5,我通过在类级别连接到模型的模型验证器执行一些模型验证。如果我发现一个错误,我需要能够将该错误附加到视图中的相关字段,以便可以清楚地向用户显示 但是,简单地将MemberName传递给ValidationResult并没有任何作用。相反,我发现我需要在控制器中重新验证,以便随后填充ModelState对象 代码如下: public class CompletedMilestoneInCorrectOrderAttribute : ValidationAttribute { private
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;
}
}
公共类CompletedMileStoneInCorrector属性:ValidationAttribute
{
private const string DefaultErrorMessage=“里程碑不能按顺序完成”;
公共已完成的里程数无校正项属性()
:base(DefaultErrorMessage)
{
}
受保护的重写ValidationResult有效(对象值,ValidationContext ValidationContext)
{
var模型=(RevisionEditViewModel)validationContext.ObjectInstance;
var previousCompleted=真;
var循环=0;
var members=新列表();
foreach(模型修正里程碑中的var rm)
{
如果(rm.Completed&!previousCompleted)
{
添加(“修订里程碑[“+循环+”].ExpectedCompletionDate”);
添加(“修订里程碑[“+循环+”]。完成”);
}
如果(!rm.不适用)
{
previousCompleted=rm.已完成;
}
loop++;
}
if(members.Any())
{
返回新的ValidationResult(DefaultErrorMessage,成员);
}
返回null;
}
}
在控制器中
[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*
}
}
[HttpPost]
[ValidateAntiForgeryToken]
公共行动结果编辑(修订编辑视图模型)
{
//如果没有此代码,错误永远不会附加到视图中的正确字段
var validationContext=新的validationContext(model,null,null);
var validationResults=新列表();
TryValidateObject(模型、validationContext、validationResults);
foreach(validationResults中的var validationResult)
{
foreach(validationResult.MemberNames中的变量memberName)
{
AddModelError(memberName、validationResult.ErrorMessage);
}
}
if(ModelState.IsValid)
{
*剪断*
}
其他的
{
*剪断*
}
}
有人知道发生了什么吗?我怎样才能更正它,使控制器中混乱的代码不再需要
干杯Mike您考虑过使用IValidatableObject接口吗?两个原因;首先,我怀疑这会有什么不同,因为该接口仍然使用ValidationResult返回验证错误。其次,我不喜欢这种模式,在我看来,模型应该是干净的,验证应该是应用于它们的东西,而不是类中不可分割的一部分。你能发布你的观点和模型吗?我强烈怀疑回发中没有包含某些内容,因为应该调用验证。抱歉,我不再处理该项目,因此无法发布更多代码。