首页 > 解决方案 > 身份用户登录后如何将模型数据传递给控制器​​?

问题描述

我有一个 ASP.NET Core 2.2 项目,其中包含 Identity Razor 页面脚手架。当用户登录尝试成功时,我需要将登录的用户 ID 和电子邮件传递给重定向控制器。Login.cshtml.cs OnPost 方法返回 LocalRedirect 函数只接受一个字符串参数,我不确定如何传递模型或值。

用户登录后,我将获得完整的用户对象,并尝试使用 ViewBag、ViewData 和 TempData 将 id 和电子邮件传递给家庭控制器。ViewBag 不是 Razor 页面的一部分,当我检查主控制器中设置的断点时,ViewData 和 TempData 的计数始终为 0。我可以附加 returnUrl 以包含 id 和电子邮件作为查询字符串,但这似乎我走错了方向。

这是一个更大的场景的一部分,我正在维护一个需要将基本模型属性传递给每个控制器的网站。最终,我打算让视图模型从基本视图模型继承,我需要 id 和电子邮件(作为简化示例)值来执行操作。我在想一个最佳解决方案将允许我将通用模型传递给 retrnUrl 重定向到的任何控制器。这个项目是 ASP.NET MVC 项目的增强升级,ASP.NET Core 对我来说有点新。在这一点上,我主要关注的是使用最适合 Asp.Net Core 方法的正确编码礼仪将参数从 Login OnPost 函数传递到重定向控制器。

public async Task<IActionResult> OnPostAsync(string returnUrl = null)
        {
            if (ModelState.IsValid)
            {
                var result = await _signInManager.PasswordSignInAsync(Input.Email, Input.Password, Input.RememberMe, lockoutOnFailure: true);
                if (result.Succeeded)
                {
                    _logger.LogInformation("User logged in.");
                    var user = await _userManager.FindByEmailAsync(Input.Email);
                    //ViewData["UserID"] = user.Id;
                    //TempData["UserID"] = user.Id;

                    //returnUrl += returnUrl + "?userId=" + user.Id;
                    return LocalRedirect(returnUrl);
                }               
            }


public HomeController(UserManager<ApplicationUser> userManager, IConfiguration configuration)
        {
            string id = ViewData["UserID"] != null ? ViewData["UserID"].ToString() : "";
            //string id2 = TempData["UserID"] != null ? TempData["UserID"].ToString() : "";
            _userManager = userManager;
            _configuration = configuration;
        }

除了不确定如何通过模型传递数据之外,ViewData 和 TempData 始终为空。我至少希望能够使用其中任何一个,但我认为模型在这里是正确的用法。有人可以建议正确的方法吗?

标签: c#asp.net-corerazorviewmodel

解决方案


推荐阅读