База данных фильтров MVC с IIdentity - PullRequest
0 голосов
/ 14 марта 2012

На моем сайте MVC Учитель входит в систему и должен просматривать свои классы и все книги, используемые в его классах.

Учитель не должен видеть кого-то другого, класс или книгу.

Вот моя модель

public class Teacher
{
    public int Id { get; set; }

    public string Name {get; set;}
}

public class Books
{
    public int Id {get; set;}

    public string Title {get; set;}

    public int CourseId {get; set;}
}

public class Course
{
    public int Id {get; set;}

    public int Name {get; set;}

    public int TeacherId {get; set;}
}

Я использую RepositoryPattern с UnitOfWork.

Для того, чтобы все классы были показаны, я должен вставить в свой контроллер следующую строку:

var classes = classRepository.All.Where(x => x.TeacherId == currentTeacher.Id)

С BookControler дела пойдут хуже, так как мне нужно проверить все классы текущего учителя:

var classes = classRepository.All.Where(x => x.TeacherId == currentTeacher.Id)
var books = bookRepository.All.Where(x => classes.Contains(y => y.Id == x.CourseId)

Мне кажется, что такой подход может привести к некоторой функциональной ошибке. я хотел бы, чтобы, когда учитель входил в мой репозиторий с автофильтром, чтобы хранить только данные, относящиеся к currentTeacher, следовательно, в моем контроллере у меня было бы:

var classes = classRepository.All; // Already filtered on currentTeacher

или

var books = bookRepository.All; // Already filtered on currentTeacher

Возможно ли это? И как?

1 Ответ

0 голосов
/ 14 марта 2012

Создайте новый метод All(IPrincipal user), в котором вы передаете текущего аутентифицированного пользователя.Этот метод All будет искать значение Identity.Name в коллекции Учителя вашего контекста объекта, чтобы получить идентификатор, который затем возвращается.

, то есть .Where(x => x.TeacherId == currentTeacher.Id) - это возвращаемое значение из этого нового All метода.

...