我有一个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";
}
执行此操作会使调用被调用 - 并显示 - 两次。一次这个电话,一次来自其他人。谁?
答案 0 :(得分:3)
如果使用验证属性(或IValidatableObject接口),则在使用模型绑定器绑定模型时,将始终执行服务器端验证。如果你想覆盖服务器端验证,我相信你需要创建自己的模型绑定器。
答案 1 :(得分:1)
当您使用模型作为参数发布到控制器操作时,ASP.NET MVC会在幕后为您做一些称为模型绑定的魔术。框架创建模型的新实例,并将表单输入复制到模型属性。在此过程中,它还将为您激活数据注释验证,IValidatableObject是数据注释的一部分。
因此,为了回答您的问题,默认的ASP.NET MVC模型绑定器正在进行验证。如果您不希望发生这种情况,请不要使用数据注释属性或实现IValidatableObject。只需创建一个自定义函数来处理验证并在控制器中调用此函数,但我不确定为什么您不希望在模型绑定期间自动进行验证。或者,您可以创建一个不会激活验证的自定义模型绑定器。