2013-03-21 30 views
0

我一直很高興地使用帶有自定義ActionFilterAtribute的BaseController類,覆蓋OnActionExecuting()。我將這個BaseController類用於我的所有控制器,作爲在傳遞給Controller時檢查id路由值的便捷方式。使用ActionFilters檢查對象訪問

這工作得很好......我檢查一個id值,如果存在,我檢查控制器名稱以確定該id所屬的對象的類型。

但是然後...我開始獲取在ControllerB中調用PartialView時出現的錯誤,並在用於父Controller/View的FilterContext中顯示相同的ID。例如,說我有一個localhost/Project/Details/5的URL,其中Project是控制器,詳細說明id = 5的操作。控制器「註釋」由於PartialView而被調用,並且此時我的ActionFilter會觸發控制器「註釋」和原始「項目」標識。用戶被允許訪問ProjectId = 5但不是NoteId = 5

我希望這是有道理的 - 我正在努力解釋。我現在需要找到某種方式來忽略PartialView,或者處理它,或者完全使用不同的方法。我的最終目標是能夠根據對象的id來檢查我的應用程序中的對象訪問。這種問題有沒有「最佳方法」?也許我需要爲每個控制器編寫一個過濾器?或者可能檢查Action名稱,所以我知道何時忽略「ID」?

我BaseController ...

public class AccessCheckAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     int id; 

     if (filterContext.RouteData.Values["id"] != null) 
     { 
      if (int.TryParse(filterContext.RouteData.Values["id"].ToString(), out id)) 
      { 
       SPTdb db = new SPTdb(); 

       switch (filterContext.RouteData.Values["Controller"].ToString().ToLower()) 
       { 
        case "project": 
         project = db.Projects.Find(id); 

回答

0

你來決定從哪個實體ID的做法很成問題。你會有許多類似於你當前問題的複雜情況。您可以使用通用基類來避免它,它仍然是一個有問題的方法

此外,如果您將數據庫訪問邏輯擴展到任何地方,則無法利用實體框架的緩存功能。例如:如果查詢操作中的有效標識符使用上下文過濾,並且您應該使用不同的上下文查詢控制器中的同一實體以顯示使用實際結果。就你而言,它可能不會造成任何問題,但它仍然是一件非常不重要的事情。

解決你的問題,你應該擺脫的動作過濾器,並使用一個簡單的結構是怎樣的倉庫模式:

public class ProjectController : Controller{ 
private GenericRead<Project> _projects; 

//you may use DI of course 
public ProjectController(){ 
    _projects = new .... 
} 

public ViewResult Details(int id){ 
    var project = _projects.Get(id); 
    if(project == null) 
     return ViewResult(); 
.... 
} 
+0

感謝回答。我仍然不明白這將如何幫助我。我實施動作過濾器的原因是,用戶無法訪問他們不允許看到的數據。 actionfilter只是檢查是否允許當前用戶訪問請求的對象(由控制器和id確定)。對我而言,這似乎是一個捕獲所有請求的好地方,如果請求不被理解或嘗試訪問「非法」,即使對於經過身份驗證的用戶,也會引發異常。我懷疑我的方法是錯誤的,因爲這是我的第一個MVC應用程序。 – tr3v 2013-03-21 17:57:40

+0

我不認爲我解釋了我想要達到的目標。 對於Action,我想檢查被訪問的對象是否被允許。使用控制器,我可以確定(假定)該對象,然後使用對象ID來查看當前用戶是否有權訪問。這可能意味着檢索父對象。例如只允許用戶(教師)能夠看到他們的課程的學生。 – tr3v 2013-03-22 01:06:18