从控制器构造函数中获取来自URL的参数
-
11-10-2019 - |
题
我需要编写一些代码以在项目数据库中找到一个ID。用户与项目相连,所有项目都与其他对象(例如会话)都有很多连接。
现在,我需要在运行任何操作之前检查一下,如果用户试图访问会话,则将其连接到与会话连接到的同一项目。
为此,我想在操作上使用[属性]。MVC:创建一个具有参数的自定义[oterizeatTribute]?
这个问题和答案让我开始了,但是我使用控制器的构造函数遇到了麻烦 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,该ID在Routedata ...
解决方案
我建议将此检查放入模型而不是控制器中。在控制器中,您需要装饰需要此检查的每个操作,请记住,这将在将其应用于的每个操作上执行代码,因此您可能不想在控制器级别上应用它。更简单的方法是在模型中实施一次检查,然后您在控制器中没有“关注”访问权限。这将使此访问权限的测试成为可能,因为您只会在一个地方进行测试。
其他提示
这就是我现在为解决它所做的事情,我对此感到非常高兴。
模块部分:
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();
}
我认为这很整洁:)
不隶属于 StackOverflow