如何从 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 中的存储库类创建确认电子邮件回调的主要内容,如果未能解决你的问题,请参考以下文章

如何在 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 不起作用

如何从 ASP.NET Core Web API 中的 SQL Server 存储过程中获取返回值

使用存储过程时出现 ASP.Net Core 3.1 MVC 错误