1

我一直很高兴地使用带有自定义 ActionFilterAtribute 的 BaseController 类,覆盖 OnActionExecuting()。我将这个 BaseController 类用于我的所有控制器,以便在将 id 路由值传递给控制器​​时检查它。

这工作得很好......我检查一个 id 值,如果它存在,我检查控制器名称,它确定 id 所属的对象类型。

但是后来...我开始收到在 ControllerB 中调用 PartialView 并在用于父 Controller/View 的 FilterContext 中显示相同 ID 时创建的错误。例如,假设我有一个 localhost/Project/Details/5 的 url,其中 Project 是控制器,Details 是 id=5 的操作。由于 PartialView 而调用了控制器“Notes”,并且这次为控制器“Notes”和原始“Project”id 触发了我的 ActionFilter。允许用户访问 ProjectId=5 但不允许访问 NoteId=5

我希望这是有道理的——我正在努力解释。我现在需要找到某种方法来忽略 PartialView,或者处理它,或者完全使用不同的方法。我的最终目标是能够根据对象的 id 检查我的应用程序中的对象访问。这类问题有“最佳方法”吗?也许我需要为每个控制器编写一个过滤器?或者也可能检查操作名称,以便我知道何时忽略“id”?

我的基础控制器...

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);
4

1 回答 1

0

我认为这个问题可以通过使用 SQL 查询来解决。您传递表名以及对象身份的 [key/value]。

于 2019-07-11T07:52:18.403 回答