在Web API 2的自定义活页夹中使用默认的IModelBinder

时间:2018-06-28 19:40:28

标签: c# .net asp.net-web-api2 model-binding

如何在自定义IModelBinder中的Web API中调用默认模型绑定程序?我知道MVC具有默认的资料夹,但是我不能将其与Web API一起使用。我只想使用默认的Web API绑定器,然后再运行一些自定义逻辑(以避免重新发明轮子)。

public class CustomBinder : IModelBinder
{
    public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
    {
        // Get default binding (can't mix Web API and MVC)
        var defaultMvcBinder = System.Web.ModelBinding.ModelBinders.Binders.DefaultBinder;
        var result = defaultMvcBinder.BindModel(actionContext, bindingContext); // Won't work
        if (result == false) return false;
        // ... set additional model properties
        return true;
    }
}

1 个答案:

答案 0 :(得分:1)

万一其他人迷惑了这个问题,我必须使用激活上下文来实现自定义模型绑定程序,因为Web API中没有可重复使用的东西。这是我用于需要支持的有限方案的解决方案。

用法

以下实现允许我让任何模型可选地使用Edit进行模型绑定,但是如果未提供,则默认为仅属性名称。它支持来自标准.NET类型(字符串,整数,双精度型等)的映射。尚未完全投入生产,但到目前为止满足我的用例。

Resource

这允许在查询中映射以下查询字符串:

/resource/create

实施

首先,该解决方案定义了一个映射属性,以跟踪模型的源属性以及在从值提供者设置值时要使用的目标名称。

JsonProperty

然后,定义了一个自定义模型绑定程序来处理映射。它缓存反映的模型属性,以避免在后续调用中重复反映。可能尚未完全投入生产,但初步测试很有希望。

[ModelBinder(typeof(AttributeModelBinder))]
public class PersonModel
{
    [JsonProperty("pid")]
    public int PersonId { get; set; }

    public string Name { get; set; }
}