2012-10-02 18 views
11

Bir web api ActionFilter'da bazı izin denetimleri yapmak istiyorum, bu yüzden nesne kimliğini çıkarabilmem gerekiyor. RouteData'ya erişebildiğim için bunu bir GET üzerinde yapabilirim, ancak bir PUT \ POST için bir eylem filtresindeki searlized viewModel nesnesine erişim mümkün mü?Bir Web API'si ActionFilterAttribute modele erişebilir mi?

public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext) 
    { 
     if (actionContext == null) 
     { 
      throw new ArgumentNullException("actionContext"); 
     } 

     //Get ID from searlized object and check permissions for a POST\PUT? 
    } 

cevap

12

ActionArguments özelliğini denediniz mi? Bazı işler olsa, bu mülke serisini belirlemek için olabilir

actionContext.Response.Content

:

+2

filterContext.ActionParameters – Felix

+0

Müthiş, teşekkürler! – NullReference

+0

MVC5 filterContext.ActionParameters, filterContext.ActionDescriptor.GetParameters() (System.Web.Mvc.ParameterDescriptor dizisini döndürür) haline geldi –

0

Bu özelliği üzerinden tefrika modele erişimi vardır. Web API belgeleri şu anda oldukça seyrek olmakla birlikte, here is the official docs.Response.Content türü HttpReponseMessage türünde olduğu için serileştirme için daha fazla ayrıntı bulmalısınız.

0

@André Scartezini 'ün yanıtını takip edeyim ve yazdığım bir örnek kod ekleyelim.

Bu, Web API yöntemine gönderilen verileri otomatik olarak günlüğe kaydetmek için kullanılan bir ActionFilter'tir. Bu işi yapmak için en iyi çözüm değil, yalnızca bir ActionFilter özniteliğinin içinden modele nasıl erişileceğini göstermek için örnek bir kod.

using System; 
using System.Collections.ObjectModel; 
using System.Linq; 
using System.Threading; 
using System.Threading.Tasks; 
using System.Web.Http.Controllers; 
using System.Web.Http.Filters; 

namespace LazyDIinWebApi.Models 
{ 
    public class LogPostDataAttribute : ActionFilterAttribute 
    { 
     public override async Task OnActionExecutingAsync(
      HttpActionContext actionContext, 
      CancellationToken cancellationToken) 
     { 
      Collection<HttpParameterDescriptor> parameters 
       = actionContext.ActionDescriptor.GetParameters(); 
      HttpParameterDescriptor parameter 
       = parameters == null ? null : parameters.FirstOrDefault(); 

      if (parameter != null) 
      { 
       string parameterName = parameter.ParameterName; 
       Type parameterType = parameter.ParameterType; 

       object parameterValue = 
        actionContext.ActionArguments == null && !actionContext.ActionArguments.Any() ? 
         null : 
         actionContext.ActionArguments.First().Value; 

       string logMessage = 
        string.Format("Parameter {0} (Type: {1}) with value of '{2}'" 
         , parameterName, parameterType.FullName, parameterValue ?? "/null/"); 

       // use any logging framework, async is better! 
       System.Diagnostics.Trace.Write(logMessage); 
      } 

      base.OnActionExecuting(actionContext); 
     } 
    } 
} 

Ve bu nasıl kullanılacağını geçerli:

// POST: api/myapi 
    [LogPostData] 
    public void Post(MyEntity myEntity) 
    { 
     // Your code here 
    } 
İlgili konular