Получить параметры из URL в конструкторе контроллера
Мне нужно написать код, чтобы найти идентификатор в моей базе данных проекта. Пользователи связаны с проектом, и все проекты имеют много связей с другими объектами, такими как сеансы.
Теперь мне нужно проверить перед выполнением каких-либо действий, подключен ли пользователь, пытающийся получить доступ к сеансу, к тому же проекту, к которому подключен сеанс.
Для этого я хочу использовать [Атрибут] в действиях. MVC: создание пользовательского [AuthorizeAttribute], который принимает параметры?
Этот вопрос и ответ положили начало, но у меня возникли проблемы с использованием конструктора контроллера, чтобы получить мой Project ID
цель состоит в том, чтобы я мог написать некоторый код в каждом конструкторе, всех моих контроллеров объектов в зависимости от проектов, найти идентификатор проекта и сделать его доступным (общедоступным), поэтому мой [customauthorize]
будет иметь доступ к этому идентификатору проекта, чтобы проверить, есть ли у пользователя доступ или нет.
Моя проблема:
public class SessionController : Controller {
NASDataContext _db = new NASDataContext();
public SessionController() {
var test = RouteData;
var ses = _db.Sessies.First(q=>q.Ses_ID==1);
}
Как я могу получить доступ к моим Routedata? RouteData
нулевой, HttpContext
является нулевым и Request
нулевой.
Мне нужен идентификатор в URL, который находится в Routedata...
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();
}
Я думаю, что это работает довольно аккуратно:)