2014-07-13 16 views
8

Ho un controllerAsp.net parametro WebAPI enum con valore di default

[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 è dichiarato come

public TypeEnum 
{ 
    Clothes, 
    Toys, 
    Electronics 
} 

Attualmente se, qualche valore spazzatura viene passato si è sempre trasformato in valore di default. Quello che voglio fare è chiamare il controller come api/products/1, quindi al ptype dovrebbe essere assegnato il valore predefinito i vestiti. Se chiamo il controller come api/products/1? PType = somegarbagevalue, il controller dovrebbe lanciare un'eccezione di richiesta non valida. Come posso raggiungere questo obiettivo?

risposta

6

Si hanno a che fare con string e utilizzare TryParse() per convertire stringa Enum valore.

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 
} 

Può sembrare ingenuo, ma il vantaggio di questo approccio è quello di consentire ptype parametro a qualsiasi stringa e per eseguire processo senza eccezione quando ptype riesce ad associare il valore.

13

Definire tutti i parametri enum come stringhe e poi l'analisi ovunque significa che devi fare questo su ogni singola azione e hai bisogno di venire con un approccio coerente in modo tale che tutti gli errori di parsing conformi.

Questo è un problema di associazione dei parametri e non deve essere affrontato nel livello controller, dovrebbe essere curato nella pipeline. Un modo per farlo è creare un filtro personalizzato e aggiungerlo alla tua configurazione.

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

e nella vostra global.asax.cs

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

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

Se hai problemi con lo stato del modello, si tratta di un tipo è ModelStateDictionary e semplicemente scorrere su di esso e poi è proprietà Errori contiene tutti i problemi di rilegatura del modello. per esempio.

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

Non capisco questa soluzione. Da dove viene il tuo codice usando/trattando 'TypeEnum' dalla domanda? Ho chiesto una [domanda correlata] (https://stackoverflow.com/questions/48424564/jsonconverter-equivalent-for-http-get-parameter) che collega anche al tuo. –

Problemi correlati