2017-01-26 3 views
0

Ich erstelle eine benutzerdefinierte ModelBinder in .NET Core 1.1.0, und ich denke, ich habe es meist herausgefunden. Ich möchte diesen Ordner nur verwenden, wenn ich das möchte, aber ich kann mir nicht vorstellen, wie ich das bewerkstellige. Ich möchte, dass dieses Modellbinder ignoriert wird, wenn ich es nicht anrufe, aber wenn ich es anrufe, möchte ich alle andere ignoriert werden. Wie kann ich das erreichen?Call benutzerdefinierte ModelBinder in .NET Core

Die zwei Dinge, die machbar scheinen, sind die Parameterattribute [Bind] und [ModelBinder], aber keine von diesen wirklich funktioniert.

Ich versuchte zunächst, die unten:

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

Wenn meine benutzerdefinierte IModelBinderProvider getroffen wird, die ModelBinderProviderContext eine BindingInfo Eigenschaft enthält, die wiederum ein IPropertyFilterProvider enthält. Beim Debuggen enthält dieser Filteranbieter eine Sammlung namens Include mit dem Wert test. Es scheint jedoch keine Möglichkeit zu geben, dies programmatisch zu überprüfen - es gibt keine Möglichkeit, dass ich tatsächlich auf diese Sammlung zugreifen kann. Es ist null, wenn nichts gesetzt ist, also könnte ich hypothetisch nach Null suchen, aber das ist sehr chaotisch und ist keine gute Idee.

Zur Veranschaulichung hier ist der Debugger-Info für das ModelBinderProviderContext:

debugger output

Als nächstes habe ich versucht, diesen Code verwenden:

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

Dieses Attribut wird keinerlei Wirkung zu haben. Es ist nicht erforderlich MyModelBinder zu verwenden; Modellbinder werden in der Reihenfolge verwendet, die in Startup.cs angegeben ist (die Liste in MvcOptions).

Antwort

0

Die PropertyFilterProvider enthält eine BindAttribute Instanz, die die IPropertyFilterProvider Schnittstelle implementiert. Sie könnten die Instanz auf eine BindAttribute gegossen und die Include Eigenschaft zugreifen:

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

Beachten Sie, dass die Besetzung nicht gelingen kann, was in bindingAttributenull zu sein.