2016-08-09 99 views
0

Ich habe eine Web-API-Modell der LinienWeb-API-Validator, der die Routenparameter/Controller Kontext zugreifen kann

class SampleModel 
{ 
    [ComponentExistsValidation] 
    public Guid? ComponentID { get; set; } 
    ... 
} 

ich bestätigen müssen, dass die ComponentID unter einem bestimmten Modell vorhanden ist, und die modelid ist verfügbar mein Controller als Routenparameter.

[Route("api/model/addcomponents/{modelid:int}")] 
public async Task AddComponents(int modelid, [FromBody]SampleModel[] components) 

Hier ist mein Validator

protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
{ 
    if (value == null) 
     return ValidationResult.Success; 
    Guid componentid = (Guid)value; 
    int modelid; // How do I get this here? 
    Model context_mdl = Model.GetModel(modelid); 
    if(!context_mdl.HasComponent(componentid)) 
    { 
     return new ValidationResult(string.Format("Invalid component")); 
    } 
} 

Kann ich den modelid Routenparameter im Validator zugreifen?

Antwort

1

Sie sollten in der Lage sein, es von HttpContext zu bekommen.

Fügen Sie einen Verweis auf System.Web.DLL hinzu, wenn HTTPContext nicht verfügbar ist.

Hier ist ein Beispiel mit IValidatableObject. Aber ich bin sicher, dass Sie es in Ihr Attribut übersetzen können, wenn Sie möchten.

class SampleModel : IValidatableObject 
{ 
    public Guid? ComponentID { get; set; } 

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     if (value == null) 
      return ValidationResult.Success; 
     Guid componentid = (Guid)value; 
     int modelid = System.Web.HttpContext.Current.Request.RequestContext.RouteData.GetWebApiRouteData("modelid"); 
     Model context_mdl = Model.GetModel(modelid); 
     if(!context_mdl.HasComponent(componentid)) 
     { 
      yield return new ValidationResult(string.Format("Invalid component")); 
     } 
    } 
} 

Und eine Erweiterung stark von this answer influensed verwenden.

public static class WebApiExtensions 
{ 
    public static object GetWebApiRouteData(this RouteData routeData, string key) 
    { 
     if (!routeData.Values.ContainsKey("MS_SubRoutes")) 
      return null; 

     object result = ((IHttpRouteData[]) routeData.Values["MS_SubRoutes"]).SelectMany(x => x.Values) 
      .Where(x => x.Key == key).Select(x => x.Value).FirstOrDefault(); 
     return result; 
    } 
}