Asp.net mvc 可靠地处理ASP.NET MVC模型绑定错误

Asp.net mvc 可靠地处理ASP.NET MVC模型绑定错误,asp.net-mvc,error-handling,model-binding,Asp.net Mvc,Error Handling,Model Binding,我正在使用MVC控制器开发一个RESTAPI。我希望处理所有模型绑定错误,并以用户友好的方式向客户机报告。在我的自定义模型绑定中,我已经抛出了一个特殊的异常,异常处理程序认为它是安全的,并向客户机显示 但是,当默认模型绑定器看到一个无效值(例如,int的asdf)时,它似乎要么完全忽略它(如果参数不是必需的),要么抛出一个普通的参数异常(如果参数是必需的)。是否可以可靠地处理这两种情况并获得参数名称和相关错误,而不必手动重写整个活页夹 我不想按原样显示ArgumentException,因为它显

我正在使用MVC控制器开发一个RESTAPI。我希望处理所有模型绑定错误,并以用户友好的方式向客户机报告。在我的自定义模型绑定中,我已经抛出了一个特殊的异常,异常处理程序认为它是安全的,并向客户机显示

但是,当默认模型绑定器看到一个无效值(例如,
int
asdf
)时,它似乎要么完全忽略它(如果参数不是必需的),要么抛出一个普通的
参数异常(如果参数是必需的)。是否可以可靠地处理这两种情况并获得参数名称和相关错误,而不必手动重写整个活页夹


我不想按原样显示
ArgumentException
,因为它显示了客户端不必关心的方法和命名空间名称。如果可以避免的话,我也不希望解析
ArgumentException
消息,这也不能解决完全忽略非必需参数的无效值的问题。

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

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" });
        }
    }
}
公共类模型:IValidatableObject{
公共int MyIntProperty{get;set;}
公共IEnumerable验证(ValidationContext ValidationContext){
如果(MyIntProperty==0){
返回新的ValidationResult(“请为MyIntProperty提供有效值。”,new[]{“MyIntProperty”});
}
}
}

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

您是否找到了一个好的解决方案?我正在考虑对
IModelBinder
进行修饰或子类化,但我想知道是否有更好的方法。@FabianSchmied:不幸的是,没有。对于这种情况,“Web API”模型绑定器可能有更好的支持——我不知道ASP.NET核心。