相关疑难解决方法(0)

在ASP.NET Web API中处理ModelState验证

我想知道如何使用ASP.NET Web API实现模型验证.我的模型是这样的:

public class Enquiry
{
    [Key]
    public int EnquiryId { get; set; }
    [Required]
    public DateTime EnquiryDate { get; set; }
    [Required]
    public string CustomerAccountNumber { get; set; }
    [Required]
    public string ContactName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后我在我的API控制器中有一个Post动作:

public void Post(Enquiry enquiry)
{
    enquiry.EnquiryDate = DateTime.Now;
    context.DaybookEnquiries.Add(enquiry);
    context.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)

如何添加if(ModelState.IsValid)然后处理错误消息以传递给用户?

c# asp.net-web-api

100
推荐指数
6
解决办法
10万
查看次数

如何将FluentValidator挂钩到Web API?

我正在尝试将Fluent验证连接到我的MVC WEB Api项目,它不想工作.

当我使用MyController : Controller- >工作正常(ModelState.IsValid返回False)

但是当我使用MyController :ApiController......没什么.

有没有人有关于如何挂钩的经验?

c# fluentvalidation asp.net-web-api

30
推荐指数
2
解决办法
2万
查看次数

Web API中的Per-Request DependencyResolver

在MVC中,ModelValidatorProvider实例化并调用a以在每个请求上验证模型.这意味着在DI环境中,它可以依赖于单个请求中作用域的对象,例如工作单元或数据库上下文.在Web API中,这似乎已经发生了重大变化.而不是按请求实例化,ModelValidatorProvider似乎是在应用程序启动期间长期存在并实例化的.然后,WebAPI缓存来自ModelValidatorProviderper类型的结果,这意味着ModelValidator不能从DI中获取任何依赖性.

我正在尝试ModelValidator使用服务定位器实现我使用工厂(请不要自动'反模式'注释!).这将允许我在每个请求中构造一个内部验证器对象,它可以从容器中获取依赖关系.但是,我无法获得一个依赖性解析器或容器作为当前请求的范围,该请求ModelValidator主要是作为Singleton的范围.我试过使用GlobalConfiguration.Configuration.DependencyResolver,但这只返回全局范围的服务(从根范围,这里提到)

我在Autofac工作,因此特定于autofac的解决方案是合适的(例如MVC具有AutofacDependencyResolver.Current,内部使用DependencyResolver.GetService).WebAPI集成中没有可用的等价物,可能是因为上面提到的全局DependencyResolver仅返回全局范围服务的原因.

我尝试这样做(以及我自己使用)的原因是为FluentValidation实现Web API集成,目前不存在.到目前为止已经进行了两次尝试,但这些尝试都没有处理依赖注入问题,而是导致单个静态ModelValidator.

到目前为止我尝试过的事情:

  • 使用GlobalConfiguration.Configuration.DependencyResolver(返回根作用域中的对象)
  • 依赖于Func<IComponentContext>(总是返回根上下文)

在已删除的答案中,建议IModelValidatorProvider从Web API配置中删除服务.这必须使用反射来完成,因为接口和实现类都被定义为内部,但它确实使验证器更好地工作(因为ModelValidator是按请求构造的).但是,由于使用反射来检查模型上的验证器及其具有的每个属性,因此以这种方式执行它会有显着的性能损失,因此我不想采用此选项.

Filip W的回答建议使用HttpRequestMessage获取依赖范围,但是我没有找到任何HttpRequestMessage.Current可以在长期存在的对象中提供对该对象的访问的东西- 如果可以实现,我相信一切都会落到实处.

autofac fluentvalidation asp.net-web-api

8
推荐指数
1
解决办法
6444
查看次数

标签 统计

asp.net-web-api ×3

c# ×2

fluentvalidation ×2

autofac ×1