c#Webapi和模型绑定与流畅验证

时间:2016-11-28 11:35:21

标签: c# asp.net-web-api

如何让asp.net webapi查看路由数据和正文以绑定到复杂对象?

使用以下路线“api / products / {productid} / manufacturers / {manufacturerId}”我需要将productId和manufacturerId绑定到模型,所以我的控制器方法是

public IHttpActionResult Create(CreateProductManufacturerModel
                createProductManufacturerModel)

我的模特是

 public class CreateProductManufacturerModel
    {
        public int ProductId { get; set; }
        public int ManufacturerId { get; set; }
        public bool IsDefault { get; set; }
        public string ManufacturerCode { get; set; }
        public string Description { get; set; }
    }

我知道我可以将我的方法更改为如下,但我使用fluentvalidation来验证整个createproductmanufacturermodel,这是自动完成的(请参阅 - http://www.justinsaraceno.com/2014/07/fluentvalidation-with-webapi2/)。因此,productId和manufacturerId将无法正确验证,因为它们被设置为零。

   public IHttpActionResult Create(int productId, int manufacturerId, CreateProductManufacturerModel
                createProductManufacturerModel)

我已经尝试了一个模型绑定器,但它不会自动触发流畅的验证。不太确定这是否重要,但发布的正文是json格式。

提前致谢。

2 个答案:

答案 0 :(得分:1)

  1. 继承System.Web.Http.Filters.ActionFilterAttribute
  2. 覆盖OnActionExecuting()
  3. 使用actionContext.RequestContext.RouteData.Values
  4. 提取路由数据
  5. 使用actionContext.ActionArguments
  6. 提取模型
  7. 验证并将路由数据分配给模型属性
  8. 使用您创建的新属性修饰您的操作。
  9. 如果这是一个不太具体的用例,您可以使用反射根据参数名称将路由数据分配给模型属性。

答案 1 :(得分:0)

您可以将行动签名更改为:

public IHttpActionResult Create([FromBody]CreateProductManufacturerModel
            createProductManufacturerModel){}

然后验证您需要的2个值:createProductManufacturerModel.ProductId和createProductManufacturerModel.ManufacturerId?