2017-05-30 3 views
0

Ich habe die folgende Controller-Methode, die den Befehl als Änderungsmodell akzeptiert, das vom Client übergeben wird.So modellieren Sie das Bindepfadsegment zur Objekteigenschaft

[HttpPut] 
    [Route("api/features/{name}")] 
    public async Task<IActionResult> PutFeatureValueAsync(
     string name, 
     [FromBody] SetFeatureCommand command, 
     CancellationToken token) 
    { 
     command.FeatureName = name; 
     await mediator.Send(command, token).ConfigureAwait(false); 
     return Ok(); 
    } 

Das Problem ist, dass ich eine Feature Eigenschaft auf den Befehl Objekt kopieren manuell, wenn ich den Namen {} in der URL halten will. Das andere Problem besteht darin, dass ich eine Überprüfung nicht ordnungsgemäß durchführen kann, wenn der FeatureName nicht während der Modellbindung festgelegt wird.

Was wäre der beste Weg, {Name} Segment des Pfads automatisch Modell Bindung an FeatureName Eigenschaft des Befehls zu haben.

Antwort

0

Dies könnte durch Verwendung einer benutzerdefinierten Modellbindung erreicht werden. Ich würde empfehlen, beginnend mit dem Lesen Model Binding Dokumentation und dann in Custom Model Binding Thema suchen. Es wird erläutert, die beiden Ansätze und Beispiele zeigen fast, was Sie brauchen:

  • den benutzerdefinierte Modell Binder (über eine eigene Implementierung von IModelBinder) Dieser Ansatz erfordert Modell Änderung: Sie [ModelBinder] Attribut auf Ihre SetFeatureCommand Klasse anwenden müssen
  • der benutzerdefinierte Modell Binder-Anbieter (über eigene Implementierung von IModelBinderProvider). So werden die integrierten Framework-Binder implementiert. Provider dann registriert wird unter Verwendung von MVC-Middleware-Optionen:

    services.AddMvc(options => 
    { 
        // add custom binder to beginning of collection 
        options.ModelBinderProviders.Insert(0, new OwnBinderProvider()); 
    }); 
    
+0

Das Problem bei diesen Ansätzen ist, dass ich die ganze Sache neu implementieren müssten, die bereits im BodyProvider ist, nicht wahr? Nehmen wir an, der Befehl hat 5 Eigenschaften. 4 von ihnen möchte ich weiterhin von [FromBody] oder was auch immer markiert ist gebunden werden. Lassen Sie jedoch eine Eigenschaft mithilfe einer benutzerdefinierten Zuordnung von einer anderen Bindungsquelle (Pfad) binden. Ich denke eher an die benutzerdefinierte IValueProviderFactory, die Routenwerte unter neu zugeordneten Namen bereitstellt, so dass die Standardmodell-Ordner sie einfach abholen –

Verwandte Themen