Как я могу получить адрес электронной почты вошедшего в систему пользователя. NET Core? - PullRequest
0 голосов
/ 24 апреля 2020

Я прошел через множество SO-тем по этому поводу и нашел способ, который работает (@UserManager.FindByNameAsync(UserManager.GetUserName(User)).Result.Email), однако мне нужно, чтобы адрес электронной почты был присвоен переменной в коде страницы, чтобы я мог использовать его для что-то еще, и класс для этого не является классом контроллера, поэтому я собираюсь сделать это вне контроллера.

Я получаю сообщение об ошибке, что Object reference not set to an instance of an object. в строке Email address: @user.Email в представлении при его запуске и при изменении типа возврата функции Index () в HomeController на PrescriptionModel я получаю сообщение об ошибке There is no argument given that corresponds to the required formal parameter 'logger' of PrescriptionModel.PrescriptionModel(ILogger<PrescriptionModel>

1 Ответ

2 голосов
/ 24 апреля 2020

Использование модели для извлечения любых данных выглядит очень плохо в случае шаблона MVC. Лучший способ, если вы не хотите трогать контроллер - используйте блоки кода в вашем представлении. например:

@using Microsoft.AspNetCore.Identity

@inject SignInManager<IdentityUser> SignInManager
@inject UserManager<IdentityUser> UserManager
@{
    var usr = await UserManager.GetUserAsync(User);
    var email = usr?.Email;
}

После того, как вы можете отобразить переменную в вашем представлении

<li class="email">
                <label asp-for="userEmail">@email</label>
                <input asp-for="userEmail" class="form-control" disabled />
</li>

Лучший способ получить данные для просмотра - это назначить их в контроллере и передать в представление в модели .

Если этот способ вам не подходит - объясните, и мы найдем правильное решение.

Лучший способ и как должна работать реализация MVC: все данные получены с контроллера с использование строго типизированных представлений:

 public class HomeController : Controller
    {
        private readonly UserManager<IdentityUser> _userManager;
        public HomeController (UserManager<IdentityUser> manager)
        {
            _userManager = manager;
        }
        public async Task<IActionResult> Index()
        {
            var usr =  await _userManager.GetUserAsync(HttpContext.User);
            return View(new UserModel { Email = usr?.Email });
        }

Где модель:

public class UserModel
    {
        public string Email { get; set; }
    }

Таким образом, вы просто запрашиваете всю информацию, которая вам нужна в действии / индексе контроллера, и передаете ее для просмотра вместе с вашим модель. Это позволяет вам иметь различные файлы назначения. Контроллер для манипулирования данными / бизнес логики Модель просто DTO для передачи значений. Вид, чтобы сделать это. Отметьте это, чтобы получить более подробную информацию: https://docs.microsoft.com/en-us/aspnet/core/mvc/overview?view=aspnetcore-3.1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...