从控制器构造函数中的URL获取参数

时间:2011-01-14 12:01:52

标签: asp.net-mvc constructor routedata

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

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

为此,我想在Actions上使用[Attribute]。 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 ...

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

这就是我现在要解决的问题,我很高兴。

模块部分:

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

然后在Modules控制器

    [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();
    }

我觉得这很有效:)