【发布时间】:2019-01-20 10:57:33
【问题描述】:
我有一个 ASP.Core 应用程序。我添加了身份。然后我对其进行了自定义,我复制了现有的逻辑以将验证电子邮件发送到位于不同目录中的另一个模型。
自动生成的脚本创建了一个 Areas/Identity 目录。在该目录下,有 Pages/Account/Manage/Index.cshtml.cs 文件。此文件夹中的代码使用相同的调用来生成确认电子邮件代码。它工作正常。
但是,当我调用 Url.Page 时,自定义模型返回 null。我不确定为什么。以下是我在 startup.cs 中自定义身份的方式
services.AddIdentity<WebUser, WebRole>()
.AddEntityFrameworkStores<MyIdentityDbContext>()
.AddDefaultTokenProviders()
.AddDefaultUI();
这是它尝试使用现有身份框架获取页面位置时中断的地方。 Url.Page 返回 null。
var userId = await _userManager.GetUserIdAsync(user);
var email = await _userManager.GetEmailAsync(user);
var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
var callbackUrl = Url.Page(
"/Account/ConfirmEmail",
pageHandler: null,
values: new { userId = userId, code = code },
protocol: Request.Scheme);
await _emailSender.SendEmailAsync(
email,
"Confirm your email",
$"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");
为什么从不同的模型调用 URL.Page 会产生这样的差异?我猜我遗漏了一些关于路由工作原理的基本知识,但不确定是什么。
【问题讨论】:
-
你是什么意思但有时?您能否使用特定操作和用户帐户重现此问题?这些代码似乎没有错误。为什么要手动创建呢,建议你试试右键Project->Add->New Scaffold Item->Identity生成需要的文件。
-
我已经使用 dotnet add identity 命令行自动创建了代码,但我已经复制了此代码以在不属于同一目录结构的其他地方使用。因此,自动代码生成有效,但是当我在另一个不在同一目录结构中的模块中使用它时,它不会。
标签: razor asp.net-core asp.net-identity asp.net-core-2.0