Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 5 ValidationResult中的MemberName未按预期工作_Asp.net Mvc 5 - Fatal编程技术网

Asp.net mvc 5 ValidationResult中的MemberName未按预期工作

Asp.net mvc 5 ValidationResult中的MemberName未按预期工作,asp.net-mvc-5,Asp.net Mvc 5,我通过在类级别连接到模型的模型验证器执行一些模型验证。如果我发现一个错误,我需要能够将该错误附加到视图中的相关字段,以便可以清楚地向用户显示 但是,简单地将MemberName传递给ValidationResult并没有任何作用。相反,我发现我需要在控制器中重新验证,以便随后填充ModelState对象 代码如下: public class CompletedMilestoneInCorrectOrderAttribute : ValidationAttribute { private

我通过在类级别连接到模型的模型验证器执行一些模型验证。如果我发现一个错误,我需要能够将该错误附加到视图中的相关字段,以便可以清楚地向用户显示

但是,简单地将MemberName传递给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;
    }
}
公共类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返回验证错误。其次,我不喜欢这种模式,在我看来,模型应该是干净的,验证应该是应用于它们的东西,而不是类中不可分割的一部分。你能发布你的观点和模型吗?我强烈怀疑回发中没有包含某些内容,因为应该调用验证。抱歉,我不再处理该项目,因此无法发布更多代码。