【问题标题】:Is there automatic server side validation with asp.net mvc 3?是否有使用 asp.net mvc 3 的自动服务器端验证?
【发布时间】:2011-08-31 10:32:55
【问题描述】:

我有一个 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"; 
}

这样做会使验证被调用 - 并显示 - 两次。一次用于此电话,一次来自其他人。谁?

【问题讨论】:

  • 你想在运行时处理数据验证,对吗?
  • 不确定你的意思,但我想在发布请求到达服务器时处理验证。

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


【解决方案1】:

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

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

【讨论】:

  • 但我使用验证属性。或者这是以某种方式隐式应用的?我正在使用 IValidatableObject,并认为我应该能够显式触发验证。
  • 对不起,是的,我的意思是在其中包含 IValidatableObject。我已经更新了我的答案。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2013-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 2012-07-13
    相关资源
    最近更新 更多