如何从 ASP.NET Core 3.1 中的存储库类创建确认电子邮件回调
Posted
技术标签:
【中文标题】如何从 ASP.NET Core 3.1 中的存储库类创建确认电子邮件回调【英文标题】:How to create confirm email callback from repository class in ASP.NET Core 3.1 【发布时间】:2022-01-15 12:07:17 【问题描述】:我想从 asp.net 核心 Web API 存储库类中创建一个电子邮件确认回调链接, 在 API 的控制器中完成此操作很容易,但我无法从存储库类中执行此操作。 我不断收到此错误:
找不到与 ActionContext 关联的 IRouter。如果您的应用程序正在使用端点路由,那么您可以通过依赖注入获取 IUrlHelperFactory 并使用它来创建 UrlHelper,或使用 Microsoft.AspNetCore.Routing.LinkGenerator。
这是我目前所拥有的:
这是我用于注册的存储库代码:
public async Task<(bool IsSuccess, string ErrorMessage)> Register(RegisterDTO model)
if (model != null)
var user = _mapper.Map<ApplicationUser>(model);
var result = await _userManager.CreateAsync(user, model.Password);
if (result.Succeeded)
await _userManager.AddToRoleAsync(user, "Admin");
var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
string _scheme = _urlHelper.ActionContext.HttpContext.Request.Scheme;
//var callbackurl = _urlHelper.Link("ConfirmEmail", new email =
user.Email, code = code );
var callbackurl =
_urlHelper.Action("ConfirmEmail",nameof(AccountController), new email = user.Email, code = code , _scheme);
var mailresult = _mailSender.SendEmail(model.Email, "Please confirm your
account by clicking here: <a href=\"" + callbackurl + "\">link</a>");
return (true, "Account created successfully");
return (false, "Eror occured while creating your account");
return (false, "Please provide the user data");
账户管理员
[HttpGet("token/email")]
public async Task<IActionResult> ConfirmEmail(string token, string email)
var result = await _repository.ConfirmEmail(token, email);
if (result.IsSuccess)
return Ok(result.ErrorMessage);
else
return BadRequest(result.ErrorMessage);
【问题讨论】:
你不应该这样做,因为它破坏了各个层的责任。使用存储库(或其他服务层)来确定功能应该是什么样的,然后让控制器层执行它。状态包装对象是一种合理的方法。 感谢您的建议,请您举例说明如何使用该状态包装器对象?? 【参考方案1】:我设法让它工作。 看下面的代码:
enter code here
public async Task<(bool IsSuccess, string ErrorMessage)>
Register(RegisterDTO model)
if (model != null)
var user = _mapper.Map<ApplicationUser>(model);
var result = await _userManager.CreateAsync(user, model.Password);
if (result.Succeeded)
await _userManager.AddToRoleAsync(user, "Admin");
var _urlHelper = _urlHelperFactory.GetUrlHelper(
_actionContextAccessor.ActionContext);
var code = await _userManager.
GenerateEmailConfirmationTokenAsync(user);
string _scheme = _urlHelper.ActionContext.
HttpContext.Request.Scheme;
var callbackurl = _urlHelper.Action(action:
nameof(AccountController.ConfirmEmail),
controller: "Account", values:
new email = user.Email, code = code ,
protocol: _scheme);
var mailresult = _mailSender.SendEmail(model.Email, "Please
confirm your account by clicking here: <a href=\"" +
callbackurl + "\">link</a>");
if (mailresult.IsSuccess)
return (true, "Account created successfully, Please visit
your email to confirm your email");
else
return (true, $"Account created successfully,
mailresult.ErrorMessage");
return (false, result.Errors.ToString());
return (false, "Please provide the user data");
【讨论】:
以上是关于如何从 ASP.NET Core 3.1 中的存储库类创建确认电子邮件回调的主要内容,如果未能解决你的问题,请参考以下文章
在 cookie 中存储 JWT 令牌后,如何在 ASP.NET Core 3.1 中破坏该 cookie 并获取信息
Asp.net Core 3.1-如何从控制器返回到 Razor 页面?
从 MVC 迁移到 ASP.NET Core 3.1 中的端点路由时,具有角色的 AuthorizeAttribute 不起作用