2012-03-09 31 views
1

我目前正在開發一個ASP.NET MVC項目。從ActionFilter中的filterContext讀取非原始ActionParameters

我想實現一個ActionFilter,它負責所有權權限。用戶只能訪問他在數據庫中與之關聯的實體。

現在我不想在每個控制器中執行此操作。相反,我想使用一個ActionFilter。 我已經可以識別傳入的參數和讀取它們的值用下面的代碼:

控制器

[Validate(ParameterName = "userID", EntityType="User")] 
public ActionMethod Edit(int userID){... 

ActionFilter

public string ParameterName { get; set; } 
public string EntityType { get; set; } 
public override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    if (EntityType != null && ParameterName != null) 
    { 
     Debug.Print("Checking if user has access to the Type \"" + EntityType + "\" with the 
ID " + filterContext.ActionParameters[ParameterName]); 
... 

到目前爲止,這工作正常。但是對於非原始類型(例如User),我只能在filterContext.ActionParameters [ParameterName]中找到NULL值;

[HttpPost] 
[Validate(ParameterName = "user", EntityType = "User")] 
public ActionResult Edit(User user) 
{.... 

我不能找出原因。難道是因爲這是一個HttpPost方法嗎?

回答

2

這應該工作假設你已經從ActionFilterAttribute衍生和還沒有實現IAuthorizationFilter因爲如果你實現這個接口的動作過濾器將模型綁定之前運行,你將無法得到這個模型綁定的結果,只有簡單的HTTP請求值。這裏有一個例子:

public class User 
{ 
    public string FirstName { get; set; } 
} 

驗證屬性:

public class ValidateAttribute : ActionFilterAttribute 
{ 
    public string ParameterName { get; set; } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var result = (User)filterContext.ActionParameters[ParameterName]; 
     if (result.FirstName == "john") 
     { 
      filterContext.Result = new HttpUnauthorizedResult(); 
     } 
    } 
} 

控制器:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(new User 
     { 
      FirstName = "john" 
     }); 
    } 

    [HttpPost] 
    [Validate(ParameterName = "user")] 
    public ActionResult Index(User user) 
    { 
     return View(user); 
    } 
} 

查看:

@model User 

@using (Html.BeginForm()) 
{ 
    @Html.EditorFor(x => x.FirstName) 
    <button type="submit">OK</button> 
} 
+0

這正是我一直在尋找答案!我在同一個類中實現了IAuthorizationFilter和ActionFilterAttribute。現在我分了他們 - 完美的作品!非常感謝 – ckonig 2012-03-12 10:23:29