2017-07-26 2 views
1

Ich möchte ein Interface-Modell von meiner Aktionsmethode mit einer Anfrage binden, dass der Inhaltstyp application/json ist. Ich verwende das Attribut [FromBody] in meiner Aktionsmethode.ASP.NET Core MVC - Modellbindung: Bindet ein Schnittstellenmodell mit dem Attribut [FromBody] (BodyModelBinder)

Ich habe versucht, eine benutzerdefinierte ModelBinder von ComplexTypeModelBinder abgeleitet, indem Sie folgenden Link: Custom Model Binding in Asp.net Core, 3: Model Binding Interfaces, aber es funktioniert nicht, mein Modell ist immer Null. Ich lernte danach, wenn Sie das Attribut [FromBody] verwenden, wird der BodyModelBinder aufgerufen und ruft intern JsonInputFormatter auf und verwendet nicht den benutzerdefinierten ModelBinder.

Ich bin auf der Suche nach einer Möglichkeit, mein Schnittstellenmodell zu binden. Ich kann die MVC DI verwenden, um jede Schnittstelle mit ihrer Implementierung abzubilden. Meine Aktion-Methode ist wie folgt definiert:

public async Task<IActionResult> Create(IOperator user) 
    { 
     if (user == null) 
     { 
      return this.BadRequest("The user can't not be null"); 
     } 

     if (!this.ModelState.IsValid) 
     { 
      return this.BadRequest(this.ModelState); 
     } 

      IOperator op = await this.AuthenticationFrontService.CreateOperatorAsync(user.Login, user.Password, user.FirstName, user.LastName, user.ValidUntil, user.Role, user.Comment); 
     return new CreatedAtActionResult("Get", "operators", new { id = ((Operator)op).Id }, op); 
    } 

ich eine andere Lösung versucht, durch das MetadataType Attribut in meiner Schnittstelle verwenden, aber es existiert nicht in den Namespace System.ComponentModel.DataAnnotations und ich las, dass asp.net Kern mvc doesn verwende dieses Attribut nicht Asp.Net MVC MetaDataType Attribute not working. Ich möchte das Paket microsoft.aspnetcore.mvc.dataannotations im Domänenmodellprojekt nicht installieren, um das ModelDataType-Attribut zu verwenden.

Ich versuchte eine andere Lösung, indem ich einen benutzerdefinierten JsonInputFormater mit anderen Worten ich leitete die Klasse JsonInputFormatter und durch die Analyse des Quellcodes habe ich festgestellt, dass der JsonSerializer konnte eine Schnittstelle deserialize nicht, die logisch ist. Also suche ich nach einer Lösung, bei der ich den jsonserializer vielleicht mithilfe eines Resolvers oder eines generischen Konverters anpassen könnte.

Jede Hilfe wird sehr geschätzt.

Danke.

Antwort

0

Die Verwendung einer Schnittstelle ist für eine C# -Methode in Ordnung, aber MVC muss wissen, welchen konkreten Typ es beim Aufruf einer Aktion instanziieren sollte, seit es sie erstellt. Er weiß nicht, welchen Typ er verwenden soll, daher kann er Eingaben von Form/QueryString/etc nicht an ihn binden. Erstellen Sie ein sehr einfaches Modell zur Verwendung in Ihrer Aktion, das nur Ihre Schnittstelle implementiert IOperator, wenn es Ihr Ziel war, es schlank zu halten, und setzen Sie das auf Ihren Aktionsparameter und es sollte gut funktionieren.

Ich habe versucht, eine Schnittstelle auf eine Aktion auch zu verwenden, und durch meine eigene Suche, fand ich keine Möglichkeit, es zur Arbeit zu bringen, außer nur Klassen anstelle von Schnittstellen zu binden.

public class Operator : IOperator 
{ 
    //Implement interface 
} 

.

public async Task<IActionResult> Create(Operator user) 
{ 
    if (user == null) 
    { 
     return this.BadRequest("The user can't not be null"); 
    } 

    if (!this.ModelState.IsValid) 
    { 
     return this.BadRequest(this.ModelState); 
    } 

     IOperator op = await this.AuthenticationFrontService.CreateOperatorAsync(user.Login, user.Password, user.FirstName, user.LastName, user.ValidUntil, user.Role, user.Comment); 
    return new CreatedAtActionResult("Get", "operators", new { id = ((Operator)op).Id }, op); 
} 
Verwandte Themen