2017-03-29 2 views
0

Viele unserer Web API Handlungsmuster haben folgende Muster:Bind WebAPI Eigenschaften ohne Aktionsparameter

public IHttpActionResult GetDetails(Guid customerGuid) 
{ 
    Customer customer = customerRetriever.FromGuid(customerGuid); 

    if (customer == null) 
     return NotFound(); 

    // Do Stuff.... 
} 

Ich möchte aus dem Action-Methode alle Kunden Lookup Kesselblech bewegen. Ich habe Attribut eines Action-Filter, dies zu tun, um den Wert des Aktionsarguments suchen und eine Anfrage-Eigenschaft:

KeyValuePair<String, Object> argument = actionContext.ActionArguments.Single(kvp => kvp.Key.Equals(ParameterName)); 
Guid customerGuid = (Guid)argument.Value; 
// Do customer lookup, return 404 if needed 
// Add customer to request properties 

Dies funktioniert, aber ich brauche noch das nun überflüssig Guid in meiner Aktion Signatur aufzunehmen. Wenn ich dies entferne, scheitert mein Ansatz, den Guid-Wert zu finden. Gibt es eine Möglichkeit, einen Wert aus dem URI zu binden, ohne diesen Wert als Aktionsparameter zu haben?

+0

ist die Kundennummer die ID, wenn der Benutzer den Anruf tätigt? Oder ruft der Benutzer einen bestimmten Kunden an? Wenn dies der Fall ist, dann sind das die Authentifizierungs- und Autorisierungsaktionsfilter. – Nkosi

Antwort

0

Sie haben customerGuid als querystring Parameter zu übergeben, wie http://localhost:61374/api/values?customerGuid=D09584F2-0B81-4855-8F33-567F4EF8096C Dann können Sie Query-String-Wert in Aktion Filter holen wie:

public class CustomFilter : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(HttpActionContext actionContext) 
    { 
     var queryStringValues = actionContext.Request.GetQueryNameValuePairs(); 
     var customerGuid = queryStringValues.FirstOrDefault(x => x.Key == "customerGuid").Value; 
     //Your logic 
    } 
} 

Jetzt gibt es keine Notwendigkeit params in API-Methode zu spezifizieren ist

public IHttpActionResult GetDetails() 
{ 
    //Do stuff 
} 
Verwandte Themen