получить параметры из URL в конструкторе контроллера - PullRequest
2 голосов
/ 14 января 2011

Мне нужно написать код, чтобы найти идентификатор в моей базе данных проекта.Пользователи подключены к проекту, и все проекты имеют много подключений к другим объектам, таким как Sessions.

Теперь мне нужно проверить перед выполнением каких-либо действий, подключен ли пользователь, пытающийся получить доступ к сеансу.к тому же проекту, к которому подключен сеанс.

Для этого я хочу использовать [Атрибут] в Действиях. 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 равно нулю, HttpContext равно нулю и Request равно нулю.

Мне нужен идентификатор в URL, который находится в routedata ...

Ответы [ 2 ]

1 голос
/ 14 января 2011

Это то, что я сделал сейчас, чтобы исправить это, и я очень рад этому.

Модуль частично:

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

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

1 голос
/ 14 января 2011

Я бы предложил разместить эту проверку в модели, а не в контроллере.В контроллере вам нужно будет декорировать каждое действие, которое требует этой проверки, помните, что он будет выполнять код каждого действия, к которому вы его применяете, поэтому вы, вероятно, не захотите применять его на уровне контроллера для начала.Более простой подход состоит в том, чтобы выполнить проверку один раз в модели, тогда у вас нет «заботы» в вашем контроллере о правах доступа.Это сделает возможным тестирование этой проверки прав доступа, поскольку тест будет проводиться только в одном месте.

...