【问题标题】:How to create confirm email callback from repository class in ASP.NET Core 3.1如何从 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);
}

【问题讨论】:

  • 你不应该这样做,因为它破坏了各个层的责任。使用存储库(或其他服务层)来确定功能应该是什么样的,然后让控制器层执行它。状态包装对象是一种合理的方法。
  • 感谢您的建议,请您举例说明如何使用该状态包装器对象??

标签: c# asp.net-core entity-framework-core asp.net-core-webapi asp.net-core-3.1


【解决方案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");
    }

【讨论】:

    猜你喜欢
    • 2022-01-23
    • 2020-07-20
    • 2023-04-04
    • 2020-11-08
    • 2021-11-19
    • 2020-04-28
    • 2012-01-23
    • 2020-08-16
    • 2021-07-25
    相关资源
    最近更新 更多