在.NET Core中调用自定义ModelBinder

时间:2017-01-26 01:01:02

标签: c# asp.net-core .net-core model-binding

我正在.NET Core 1.1.0中创建一个自定义的ModelBinder,我想我已经把它弄清楚了。我只想在我特别想要的时候使用这个活页夹,但我无法弄清楚如何实现这一点。我希望在不调用它时忽略此模型绑定器,但是当我调用它时,我希望忽略所有其他。我怎么能做到这一点?

看似可行的两件事是参数属性[Bind][ModelBinder],但这些都不起作用。

我首先尝试了以下内容:

[HttpGet]
public async Task<IActionResult> Get([Bind("test")] int userId)
{
    // stuff
}

当我的自定义IModelBinderProvider被点击时,ModelBinderProviderContext包含BindingInfo属性,而该属性又包含IPropertyFilterProvider。调试时,该过滤器提供程序包含一个名为Include的集合,其值为test。似乎没有任何方法可以以编程方式检查 - 但是我无法找到实际访问该集合的方法。如果没有设置,它就为null,所以我可以假设检查为null,但这非常混乱并且不是一个好主意。

为了说明,这是ModelBinderProviderContext的调试器信息:

debugger output

接下来,我尝试使用此代码:

[HttpGet]
public async Task<IActionResult> Get(
    [ModelBinder(BinderType = typeof(MyModelBinder))] int userId
)
{
    // stuff
}

此属性似乎无效。它不会强制使用MyModelBinder;模型绑定器按Startup.cs中指定的顺序使用(MvcOptions中的列表)。

1 个答案:

答案 0 :(得分:0)

PropertyFilterProvider包含实现IPropertyFilterProvider接口的BindAttribute实例。您可以将实例强制转换为BindAttribute并访问Include属性:

var bindAttribute = context.BindingInfo.PropertyFilterProvider as BindAttribute;
var include = bindAttribute?.Include;

请注意,演员表可能不会成功,导致bindingAttribute成为null