Asp.net mvc 3 在GET上显示验证消息

Asp.net mvc 3 在GET上显示验证消息,asp.net-mvc-3,model-view-controller,validation,Asp.net Mvc 3,Model View Controller,Validation,我们有一种可能性,从GET操作加载的数据可能对发布无效,并且希望能够在首次加载数据时显示验证消息。所有验证都使用ValidationAttribute在服务器端进行 如何在首次加载数据时强制显示验证摘要?我猜我需要以某种方式强制错误进入ModelState,但我首先需要将它们从model类中取出。我不知道是否理解您的需要,但这里是它 使用jquery运行验证以在加载表单时显示验证摘要 $(document).ready(function() { $('#FormId').valid();

我们有一种可能性,从GET操作加载的数据可能对发布无效,并且希望能够在首次加载数据时显示验证消息。所有验证都使用ValidationAttribute在服务器端进行


如何在首次加载数据时强制显示验证摘要?我猜我需要以某种方式强制错误进入ModelState,但我首先需要将它们从model类中取出。

我不知道是否理解您的需要,但这里是它

使用jquery运行验证以在加载表单时显示验证摘要

$(document).ready(function() {
    $('#FormId').valid(); 
});

最后,我为模型类添加了一个验证方法,该方法将错误添加到ModelState中。然后我创建并添加了一个自定义ModelValidator和AssociatedValidatorProvider 用于在表单绑定期间进行的正常验证期间调用它。这样,不直接绑定到模型类的控制器操作仍然可以调用模型的.Validate(ModelState)方法来伪造验证。这种方法适用于仅服务器端验证

UserInfo模型类

private IEnumerable<RuleViolation> GetRuleViolations()
{
    List<RuleViolation> violationList = new List<RuleViolation>();

    if (String.IsNullOrWhiteSpace(FirstName)) 
        violationList.Add(new RuleViolation("First Name is required.", FirstName"));

    return violationList;
}

public void Validate(System.Web.Mvc.ModelStateDictionary ModelState)
{
    foreach (RuleViolation violation in GetRuleViolations())
   {
        ModelState.AddModelError(violation.PropertyName, violation.ErrorMessage);
   }
}
这就是我在处理的特定用例所要做的一切。但我继续并完成了在回发上进行“正常”验证的工作:创建了一个简单的ModelValidator,验证覆盖如下所示。如果您在所有模型类中都遵循上述模式,那么您可能也可以为它们重用此模式

public override IEnumerable<ModelValidationResult> Validate(object container)
{
    var results = new List<ModelValidationResult>();
    if (Metadata.Model != null)
    {
        UserInfoViewModel uinfo = Metadata.Model as UserInfoViewModel;
        foreach (var violation in uinfo.GetRuleViolations())
        {
            results.Add(new ModelValidationResult
                {
                    MemberName = violation.PropertyName,
                    Message = violation.ErrorMessage
                });
        }
    }
    return results;
}
公共重写IEnumerable验证(对象容器)
{
var results=新列表();
if(Metadata.Model!=null)
{
UserInfoViewModel uinfo=Metadata.Model为UserInfoViewModel;
foreach(uinfo.GetRuleViolations()中的变量冲突)
{
结果。添加(新模型验证结果)
{
MemberName=violation.PropertyName,
Message=违规。错误消息
});
}
}
返回结果;
}

最后,扩展AssociatedValidationProvider以返回此ModelValidator,并将其添加到应用程序启动中的ModelValidationProviders集合中。在

上有一篇文章,你读了吗?您可以运行验证,然后用值填充ModelState。这正是我一直在寻找的东西,@LukLed,谢谢……现在就尝试一下。我尝试过,@LukLed,但无法强制一致地进行验证。只要它们基于DataAnnotation中的固定属性,它们就会触发,但我们添加的自定义属性没有…不知道为什么,我采取了另一种方法,见下文。
public override IEnumerable<ModelValidationResult> Validate(object container)
{
    var results = new List<ModelValidationResult>();
    if (Metadata.Model != null)
    {
        UserInfoViewModel uinfo = Metadata.Model as UserInfoViewModel;
        foreach (var violation in uinfo.GetRuleViolations())
        {
            results.Add(new ModelValidationResult
                {
                    MemberName = violation.PropertyName,
                    Message = violation.ErrorMessage
                });
        }
    }
    return results;
}