我一直很高興地使用帶有自定義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);
感謝回答。我仍然不明白這將如何幫助我。我實施動作過濾器的原因是,用戶無法訪問他們不允許看到的數據。 actionfilter只是檢查是否允許當前用戶訪問請求的對象(由控制器和id確定)。對我而言,這似乎是一個捕獲所有請求的好地方,如果請求不被理解或嘗試訪問「非法」,即使對於經過身份驗證的用戶,也會引發異常。我懷疑我的方法是錯誤的,因爲這是我的第一個MVC應用程序。 – tr3v 2013-03-21 17:57:40
我不認爲我解釋了我想要達到的目標。 對於Action,我想檢查被訪問的對象是否被允許。使用控制器,我可以確定(假定)該對象,然後使用對象ID來查看當前用戶是否有權訪問。這可能意味着檢索父對象。例如只允許用戶(教師)能夠看到他們的課程的學生。 – tr3v 2013-03-22 01:06:18