2011-11-17 57 views
7

我正在开发一个使用MVC控制器的REST API。我想处理所有模型绑定错误,并以用户友好的方式向客户报告。在我的自定义模型绑定器中,我已经抛出了异常处理程序认为安全的特殊异常,并向客户端显示。可靠地处理ASP.NET MVC模型绑定错误

然而,当默认的模型粘合剂看到一个无效值(比方说,asdfint)似乎要么完全忽略它(如果该参数不是必需的),或者抛出一个普通的ArgumentException(如果需要的参数)。是否可以可靠地处理这两种情况并获取参数名称和相关错误,而无需手动重写整个联编程序?

我宁愿不按原样显示ArgumentException,因为它揭示了客户端不应该关心的方法和名称空间名称。如果它是可以避免的,我也不会解析ArgumentException消息,并且这不会解决非完整忽略的非必需参数的无效值问题。

+0

你有没有找到一个好的解决方案?我正在考虑装饰或继承'IModelBinder',但我想知道是否有更好的方法。 –

+0

@FabianSchmied:可惜没有。 “Web API”模型绑定器可能对这种情况有更好的支持 - 我不了解ASP.NET Core。 –

回答

3

您可以在模型上实现IValidatableObject接口。您可以创建自己的验证逻辑,替换当前拥有的Required属性验证。

public class Model : IValidatableObject { 
    public int MyIntProperty { get; set; } 

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) { 
     if (MyIntProperty == 0) { 
      yield return new ValidationResult("Please provide a valid value for MyIntProperty.", new[] { "MyIntProperty" }); 
     } 
    } 
} 

在您的控制器中,您可以检查ModelState.Errors集合以查看验证错误。此外,如果您使用强类型视图和HTML表单助手,这将在客户端生成错误CSS类。