Полагаю, у меня довольно стандартная проблема, поскольку я хочу передать определенные данные из контроллера asp.net MVC 5 в общее представление, в моем случае навигация.
У меня есть шаблон, который отображает имя пользователя и картинку пользователя в общем представлении навигации, поэтому мне нужно передать ему соответствующие данные.
Моя структура макета:
- Shared \ Layout
- Shared \ Header
- Shared \ навигация
- % Body%
- Shared \ Footer
Там, где макет является главным представлением, и, конечно, у меня также есть другие виды, такие как Home \ Index.
Как вы можете себе представить, я должен показывать имя пользователя и его userpicture в каждом представлении, кроме входа в систему / регистрации или любых представлений об ошибках.
Эти представления вообще не используют макет, поэтому каждый раз, когда представление отображается с использованием структуры макета, пользователь уже вошел в систему.
Итак, я исследовал способы передачи данных от моего контроллера в навигационное представление, хотя мой контроллер возвращает представление индекса и будет признателен за некоторые разъяснения по поводу их недостатков и правильного выбора в моем случае использования:
Вариант использования:
В моем проекте есть довольно тупое приложение MVC, к которому пользователь может получить доступ. Как только он входит в приложение MVC, аутентифицирует пользователя по тому же веб-интерфейсу, откуда оно получает свои данные и сохраняет маркер доступа, а также другие данные пользователя для дальнейших запросов. Я еще не уверен, где хранить эти данные. Насколько я понимаю, варианты будут Cookies, Session и локальное хранилище.
Поскольку я довольно новичок в asp.net, MVC и C # в целом, я еще не выяснил, как заставить атрибут [Authorize] работать внутри приложения MVC, чтобы он мог пометить пользователя как аутентифицированного: /
Я предполагаю, что ключевая проблема заключается в том, что приложение MVC не имеет доступа к базе данных и, следовательно, не может проверить имя входа и заполнить идентификатор пользователя.
Как передать данные с контроллера для просмотра:
ViewBag: самый простой способ передачи данных в представление. Он не является строго типизированным и доступен во всех видах. Мне сказали, что это плохая практика, и мне посоветовали использовать viewModels.
ViewData: похоже, то же самое, что и viewdata.
ViewModel: строго типизированная модель, которая передается в представление и должна быть объявлена в любом представлении, которое ее использует. Так что, если я хочу использовать его в моем виде навигации, мне нужно объявить его там. Большим недостатком этого подхода является то, что каждая модель представления должна иметь вид baseViewModel, чтобы они имели общую структуру, которая, очевидно, может вызвать проблемы в будущем, а также не позволяет мне наследовать другие модели для заполнения моей viewModelStructure.
Cookies: Очевидно, что я могу сохранять данные в cookie во время входа в систему, а затем обращаться к ним в представлении, но куки должны быть, поэтому я не смогу сохранить эту информацию в сеансе или локальном хранилище
Сеанс: я также могу хранить данные в сеансе, но срок сеанса истекает, когда пользователь закрывает вкладку браузера.
LocalStorage: Это довольно ново для меня, поэтому я не могу судить об этом.
Удостоверение пользователя: я только что обнаружил, что могу также получить доступ к удостоверению пользователя из Context.User.Identity.
Глобальный фильтр, такой как атрибут [Authorize] или пользовательский: если я правильно понимаю, с помощью глобального фильтра я могу автоматически заполнять необходимые данные при каждом действии контроллера и исключать те, которые им не нужны, такие как вход в систему / регистрация и т. Д. Я еще не уверен, как применить этот способ из-за структуры моего проекта (см. Выше).
RenderAction: я мог бы также вызвать другой метод контроллера через вспомогательный метод RenderAction, чтобы всегда отображать этот раздел страницы.
Как вы, ребята, решаете эту проблему?
Если вам нужно больше разъяснений, пожалуйста, спросите.
Спасибо:)