【问题标题】:How to get an id from a controller and pass it to another controller in c#如何从控制器获取id并将其传递给c#中的另一个控制器
【发布时间】:2020-08-01 11:09:17
【问题描述】:

我在基于 .NET Core 的 WebAPI 上使用实体框架,我需要从控制器获取 id 并将其传递给另一个控制器,我需要将其存储在数据库中。 首先,在 Controller1 中,我有一个 Create() 方法,我在其中返回一个用户,并且有分配 id 的时刻。

public User Create(User user, string password)
    {
        // validation
        if (string.IsNullOrWhiteSpace(password))
            throw new AppException("Password is required");

        if (_context.Users.Any(x => x.Username == user.Username))
            throw new AppException("Username \"" + user.Username + "\" is already taken");

        byte[] passwordHash, passwordSalt;
        CreatePasswordHash(password, out passwordHash, out passwordSalt);

        user.PasswordHash = passwordHash;
        user.PasswordSalt = passwordSalt;


        _context.Users.Add(user);
        _context.SaveChanges();
     
        return user;
    }

在最后一步中,返回的“用户”已经设置了属性 ID。 之后,我需要获取 user.Id 并将其传递给 Controller2,如下所示:

 [HttpPost]
    public async Task<ActionResult<PaymentDetail>> PostPaymentDetail(PaymentDetail paymentDetail)
    {    
        _context.PaymentDetails.Add(paymentDetail);
        await _context.SaveChangesAsync();

        return CreatedAtAction("GetPaymentDetail", new { id = paymentDetail.PMId}, paymentDetail);
    }

我想我需要像 user.Id = paymentDetail.userId 这样的东西。

这是我调用 Create() 方法的 Controller1:

 [HttpPost("register")]
    public IActionResult Register([FromBody]RegisterModel model)
    {
        // map model to entity
        var user = _mapper.Map<User>(model);
        try
        {
            // create user
            _userService.Create(user, model.Password);
            
            return Ok();
        }
        catch (AppException ex)
        {
            // return error message if there was an exception
            return BadRequest(new { message = ex.Message });
        }
    }

【问题讨论】:

  • 两个控制器都在项目中吗?您可以创建第二个控制器的本地实例并直接调用该方法吗?
  • 两个控制器都在项目中。调用是从客户端(角度应用程序)进行的。这个想法是,当我在客户端注册一个新用户时,第一个 http 帖子转到创建用户登录详细信息的第一个控制器,然后第二个帖子转到我只想添加用户的第二个控制器id 作为不同表中的参考(在数据库中)。
  • 你想在一两个Http请求中完成吗?
  • 实际上我有两个来自客户端的两个控制器的发布请求。我需要将在第一个控制器中分配的 usedId 传递给第二个控制器

标签: c# .net-core entity-framework-core


【解决方案1】:

有几种方法可以做你想做的事。通常,您会利用 .NET Core 中内置的出色的依赖注入功能,然后实现 Repository Pattern

看来你已经完成了一半。

您的控制器应该做最低限度的工作(简单地调用您的 DI 服务),而您的服务应该完成所有繁重的工作。

您的控制器中有很多业务逻辑。该逻辑应该被抽象为 DI 服务。通过这种方式,您可以轻松地在所有控制器之间共享该逻辑,只需通过控制器构造函数注入它们即可。

通常,您不会从另一个控制器调用项目中的一个控制器。如果你想这样做,你必须发出一个实际的 Http 请求(使用HttpClient),这会浪费资源,尤其是当你拥有触手可及的依赖注入功能时。

我提供的链接显示了我所说的一些很好的例子,但如果你想要一个更具体的例子,我很乐意提供一个。

【讨论】:

    【解决方案2】:

    我认为你可以使用呼叫控制器。

    OneController.cs

    public class OneController : Controller
    {
        public IActionResult Index()
        {
            var id = CreateUser();
    
            TwoController con = new TwoController();
            var returnvalue = con.Register(id);
    
            return View();
        }
    
        public int CreateUser()
        {
            return 1;
        }
    }
    

    TwoController.cs

    public class TwoController : Controller
    {
        public string Register(int id)
        {
            if (id == 1)
                return "Success";
            else
                return "Fail";
        }
    }
    

    结果

    【讨论】:

    • 这样做的问题是控制器是 MVC 模式的构造。您只是跳过了整个 HTTP 管道(包括依赖注入管道)以直接获取控制器方法。 MVC 控制器不是以这种方式使用的,这超出了笨拙的范围。
    • 我需要获取在第一个控制器中分配的 userId 并将其传递给第二个控制器,以便为不同的实体分配值。
    • 是的,你可以查看我的帖子。这就是你需要的。 OneController = 你的第一个控制器。 TwoController = 你的第二个控制器。您只需要在我的帖子中修改函数,为第二个控制器中的不同实体分配值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多