是否有自动服务器端验证与asp.net mvc 3?

时间:2011-08-31 10:32:56

标签: .net asp.net-mvc-3 validation

我有一个asp.net mvc 3应用程序,现在我正在尝试添加一些验证。我正在测试一个干净的解决方案。我不希望在客户端(现在)进行验证,所以我在Web.config中禁用了它:

<add key="ClientValidationEnabled" value="false"/>

我有一个实现IValidatableObject的简单类,我想使用Validate函数进行验证(而不是属性)。

public class SomeClass : IValidatableObject
{
    public int Id { get; set; }
    public int LowNumber { get; set; }
    public int HighNumber { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (LowNumber > HighNumber)
        {
            yield return new ValidationResult("LowNumber should not be higher than HighNumber.");
        }
    }
}

现在回答这个问题。服务器端验证是否自动应用,以及如何应用?如何禁用此功能?我想自己控制一下 - 在我的帖子中说出这样的话:

[HttpPost]
public string SomeAction(SomeClass model)
{
    if (TryValidateModel(model))
        return "All good";
    else
        return "No good"; 
}

执行此操作会使调用被调用 - 并显示 - 两次。一次这个电话,一次来自其他人。谁?

2 个答案:

答案 0 :(得分:3)

如果使用验证属性(或IValidatableObject接口),则在使用模型绑定器绑定模型时,将始终执行服务器端验证。如果你想覆盖服务器端验证,我相信你需要创建自己的模型绑定器。

关于主题here的一些很好的信息以及关于活页夹和验证管道here的精彩文章。

答案 1 :(得分:1)

当您使用模型作为参数发布到控制器操作时,ASP.NET MVC会在幕后为您做一些称为模型绑定的魔术。框架创建模型的新实例,并将表单输入复制到模型属性。在此过程中,它还将为您激活数据注释验证,IValidatableObject是数据注释的一部分。

因此,为了回答您的问题,默认的ASP.NET MVC模型绑定器正在进行验证。如果您不希望发生这种情况,请不要使用数据注释属性或实现IValidatableObject。只需创建一个自定义函数来处理验证并在控制器中调用此函数,但我不确定为什么您不希望在模型绑定期间自动进行验证。或者,您可以创建一个不会激活验证的自定义模型绑定器。