nah I propose to do everything in 3D not in 2D as you explained, also I don't think that you have to snap to the axis
Finally I un-project this point back to world space, and I'll know exactly where the controller has been moved in 3D space.
you can not unproject a 2D point to a 3D point, you can only get a line in 3D space out of a 2D point. To get the correct Position in worldspace you have to check where the two lines(unprojected & movment axis) are intersecting.
If you want to do it your way. I think what I did is perhaps cleaner cause you aren'T doing that much conversation between spaces.