【问题标题】:get parameters from URL in controller constructor从控制器构造函数中的 URL 获取参数
【发布时间】:2011-01-14 12:01:51
【问题描述】:

我需要编写一些代码来在我的项目数据库中找到一个 ID。 用户与一个项目耦合,所有项目都与其他对象(例如 Sessions)有很多连接。

现在我需要在运行任何操作之前检查,如果尝试访问会话的用户连接到会话所连接的同一个项目。

为此,我想在操作上使用 [属性]。 MVC: creating a custom [AuthorizeAttribute] which takes parameters?

这个问题和答案让我开始了,但我无法使用控制器的构造函数来获取我的Project ID

目标是我可以在每个构造函数中编写一些代码,在我的所有对象控制器中,取决于项目,找到项目 ID,并使其可访问(公共),所以我的 [customauthorize] 将可以访问这个项目ID,检查用户是否有访问权限。

我的问题:

public class SessionController : Controller {

    NASDataContext _db = new NASDataContext();


    public SessionController() {
        var test = RouteData;
        var ses = _db.Sessies.First(q=>q.Ses_ID==1);
    }

如何访问我的路由数据? RouteData 为空,HttpContext 为空,Request 为空。

我需要url中的ID,在routedata中...

【问题讨论】:

    标签: asp.net-mvc constructor routedata


    【解决方案1】:

    我建议将此检查放在模型而不是控制器中。在控制器中,您需要装饰需要此检查的每个操作,记住这将在您应用它的每个操作上执行代码,因此您可能不想从控制器级别开始应用它。更简单的方法是在模型中执行一次检查,然后您的控制器中就无需“担心”访问权限。这将使此访问权限检查的测试成为可能,因为您只需在一个地方进行测试。

    【讨论】:

    • 检入模型。这是一个有趣的方法。如何做到这一点?你有任何讲座/例子吗?我会在模型上编写扩展方法,还是像在编辑操作 GET 请求中一样,更改获取对象的 LINQ 代码,并在那里添加过滤器,这将导致找不到项目,并且需要对正确的错误消息进行一些额外检查。
    • 真正归结为模型的实现方式。如果您只是在控制器操作中访问 Linq to SQL,那么您有两种基本方法和一种架构方法。第一个使我的建议没有实际意义,这就是您要修改访问具有访问控制的对象的代码的每个实例的地方。第二种是利用 L2S 对象作为部分生成的事实,并将检查添加到 Project 对象中。最后一个是最好的恕我直言,实现存储库模式并将检查放入存储库。更清洁、可测试和可维护。
    • 你有关于第二个选项的任何例子吗?我有一些在项目开始的“树”中有 4lvls 深的对象。不同的角色也以不同的方式与项目耦合。因此,如果我的选项 2 正确,您将添加一个方法,该方法将当前用户作为参数并返回一个布尔值,可访问与否?当我有这个代码(模块是项目的孩子) var mod = _db.Modules.First(m => m.Mod_ID == id);然后我会调用 mod.Project.IsAccessible(User) 吗?这是你建议的工作方式吗? :)
    • 我没有手头的例子,我倾向于从头开始编写我的 L2S 对象。在我的脑海中,我可能会使用 bool IsAccessible(MembershipUser User) 方法扩展 Module 对象(假设这是您正在使用的身份验证方法),然后使用 var mod = db.Modules.First(m => m.Mod_ID == id && m.IsAccessible(user));
    • 我会试一试,但可能是m.project.IsAccessible(user) :)
    【解决方案2】:

    这就是我现在所做的修复它,我对此感到非常高兴。

    模块部分:

    public partial class Module {
        public string FullName {
            get {
                return Mod_Code + " " + Mod_Titel;
            }
        }
        public string ShortName {
            get {
                return Mod_Code;
            }
        }
        public bool IsAccessible() {
            return this.Projecten.IsAccessible();
        }
    }
    

    项目部分:

    public partial class Projecten {
        public string FullName {
            get {
                if (Proj_Kortenaam == Proj_Naam)
                    return Proj_Kortenaam;
    
                return Proj_Kortenaam + " " + Proj_Naam;
            }
        }
        public string ShortName {
            get {
                return Proj_Kortenaam;
            }
        }
    
        public bool IsAccessible() {
            return IsAccessible(HttpContext.Current.User);
        }
    
        public bool IsAccessible(IPrincipal user) {
            //this code checks if the user can access or not
            return MvcApplication.projectToegankelijk(user, this._Proj_ID);
        }
    }
    

    然后在模块控制器中

        [NonAction]
        public ActionResult noRights() {
            ViewData["delError"] = "You have no rights.";
            return View("Error");
        }
    
        //
        // GET: /Modules/Details/5
        public ActionResult Details(int id) {
            var mod = _db.Modules.First(q => q.Mod_ID == id);
            if (mod.IsAccessible()) {
                return View(mod);
            }
            return noRights();
        }
    

    我认为这很好用:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-01
      • 2015-02-07
      • 1970-01-01
      • 2016-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多