2014-07-13 10 views
8

Ich habe eine ControllerAsp.net WebAPI Enum Parameter mit Standardwert

[HttpGet] 
    [RoutePrefix("api/products/{productId}")] 
    public HttpResponseMessage Products(int productId,TypeEnum ptype=TypeEnum.Clothes) 
{ 
    if(!Enum.IsDefined(typeOf(TypeEnum),ptype)) 
     //throw bad request exception 
    else 
     //continue processing 
} 

MyEnum als

public TypeEnum 
{ 
    Clothes, 
    Toys, 
    Electronics 
} 

erklärt Derzeit wenn einige Müll Wert wird übergeben sie in Standardwert umgewandelt zu werden. Was ich tun möchte ist, wenn ich den Controller als api/products/1 aufrufen, dann sollte der ptype Standardwert, d. Wenn ich den Controller als api/products/1? PType = some-garbagevalue nenne, sollte der Controller eine Exception für eine fehlerhafte Anfrage auslösen. Wie kann ich das erreichen?

Antwort

6

Sie haben mit string zu tun und TryParse() verwenden, um Zeichenfolge in Enum Wert zu konvertieren.

public HttpResponseMessage Products(int productId,string ptype="Clothes") 
{ 
    TypeEnum category = TypeEnum.Clothes; 
    if(!Enum.TryParse(ptype, true, out category)) 
     //throw bad request exception if you want. but it is fine to pass-through as default Cloathes value. 
    else 
     //continue processing 
} 

Es sieht naiv kann aber der Vorteil dieses Ansatzes ist ptype Parameter unabhängig von Zeichenfolge zu ermöglichen und ohne Ausnahme Prozess auszuführen, wenn ptype den Wert binden ausfällt.

13

definieren alle Ihre Enum Parameter als Strings und sie dann überall Parsen bedeutet, dass Sie diese auf zu tun haben, jede einzelne Aktion und Sie müssen mit einem einheitlichen Ansatz kommen, so dass alle Parsen Fehler entsprechen.

Dies ist ein Parameter bindendes Problem und sollte nicht in der Controller-Schicht behandelt werden, es sollte in der Pipeline berücksichtigt werden. Eine Möglichkeit besteht darin, einen benutzerdefinierten Filter zu erstellen und ihn zu Ihrer Konfiguration hinzuzufügen.

public class ModelStateValidationAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(HttpActionContext actionContext) 
    { 
     if (!actionContext.ModelState.IsValid) 
     { 
      actionContext.Response = <your standardised error response> 
     } 
    } 
} 

Und in Ihrem global.asax.cs

... 
GlobalConfiguration.Configure(WebApiConfig.Register); 
... 

public class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     ... 
     config.Filters.Add(new ModelStateValidationAttribute()); 
     ... 
    } 
} 

Wenn Sie Probleme mit dem Modellzustand, sind, ist es Art ein Modelstate ist und man einfach über sie iterieren und dann enthält es Eigenschaft Errors alle Probleme mit der Modellbindung. z.B.

modelState = actionContext.ModelState; 
modelState.ForEach(x => 
     { 
      var state = x.Value; 
      if (state.Errors.Any()) 
      { 
       foreach (var error in state.Errors) 
       { 
        <work your magic> 
       } 
      } 
     }); 
+0

Ich verstehe diese Lösung nicht ganz. Wo ist Ihr Code, der 'TypeEnum' aus der Frage verwendet/behandelt? Ich habe eine [verwandte Frage] (https://stackoverflow.com/questions/48424564/jsonconverter-äquivalent-for-http-get-parameter) gefragt, die auch zu Ihren verbindet. –