Получить параметры из 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();
    }

Я думаю, что это работает довольно аккуратно:)

Другие вопросы по тегам