2013-07-14 111 views
2

我目前正在嘗試編寫自定義身份驗證篩選器,並且需要訪問正在作爲參數傳遞給我的篩選器中的操作的dto。比方說,我有這樣如何從AuthorizationContext獲取MVC Action參數?

[AuthenticateProfile] 
public ActionResult EditProfile(ProfileDTO profileDto) 
    { 
     if (ModelState.IsValid) 
     { 
      // Do crazy stuff 
     } 

     return something.... 
    } 

我需要根據一些是profiledto對象內部的屬性做我的驗證的動作。

我想知道如何從AuthorizationContext獲取我的過濾器中的這個對象。

回答

2

假設你的邏輯在OnActionExecuting(運行實際控制操作之前的意思)發生的事情,那麼這樣的一種方式(如概述here)將是:

public override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    if (!filterContext.Controller.ViewData.ModelState.IsValid) 
     return; 

    var profileDto = filterContext.ActionParameters.SingleOrDefault(ap => ap.Key == "profileDto").Value; 
    if (profileDto != null) 
    { 
     // do something with profileDto 
    } 
} 
+0

謝謝,但我忘了我需要在我的OnAuthorization方法裏面我有權訪問AuthorizationContext,我相信我無法從該上下文訪問操作參數。任何想法? –

+0

然後,您必須訪問原始路由值,因爲AuthorizationFilters在任何模型綁定發生之前運行。 – rossipedia

+0

謝謝,你能詳細說明一下嗎? –

4

我是這樣做的:

var parameters = filterContext.ActionDescriptor.GetParameters(); 
var values = parameters.Select(s => new 
      { 
       Name = s.ParameterName, 
       Value = filterContext.HttpContext.Request[s.ParameterName] 
      }); 
1

ASP.NET核心

var parameters = 
     filterContext 
     .ActionDescriptor 
     .Parameters 
     .Select(s => new 
     { 
      Name = s.Name, 
      Value = context.HttpContext.Request.Query[s.Name] 
     }); 

擴展

public static StringValues? Parameter(this AuthorizationFilterContext context, string name) 
{ 
    var parameter = context.ActionDescriptor.Parameters.FirstOrDefault(it => it.Name == name); 
    if (parameter == null) return null; 
    return context.HttpContext.Request.Query[parameter.Name]; 
} 

使用

var parameter = context.Parameter("id"); 
0

這裏有一些例子讓你嘗試:用

public class AuthenticateProfileAttribute : AuthorizeAttribute { 
    public override void OnAuthorization(AuthorizationContext filterContext) { 
     // Looping through named parameters 
     foreach (string name in filterContext.HttpContext.Request.QueryString.AllKeys) { 
      var value = filterContext.HttpContext.Request.QueryString[name]; 
      // do something with the iteration 
      Console.WriteLine(name + ": " + value); 
     } 

     // Looping through un-named parameters a.k.a route parameters 
     foreach (KeyValuePair<string, object> parameter in filterContext.RouteData.Values) { 
      var name = parameter.Key; 
      var value = parameter.Value; 
      // do something with the iteration 
      Console.WriteLine(name + ": " + value); 
     } 

     // Get single named parameter 
     string parameter = filterContext.HttpContext.Request.QueryString["parameter"]; 

     // Get single route parameter 
     parameter = filterContext.RouteData.Values["parameter"].ToString(); 
    } 
} 

MVC 5.

相關問題