If you need to share code across controllers then promote that code up your layers to the next level. In most apps that would be the service layer. Then modify both controllers to call the same (now shared) code. This is probably the easiest and cleanest refactoring. Any data it needs should be passed into the method. Any data coming back can then be morphed by the controller to produce the final result.
Alternatively if the code is tightly integrated with your controllers then create a base class for your controllers and move the logic into there. Have each controller derive from the new base type and use the shared code. This is only a good idea if the actual code requires a lot of integration into the ASP.NET runtime. In general this would be a first refactor step to making the code less reliant on ASP.NET.
Yet another alternative is to have one controller method simply call the other controller's action. They are public methods after all. However the downside to this is that any validation you are doing in the called action has probably already been done so you're wasting some cycles. But it might be OK.
Finally, ActionResult
is just an implementation of getting a result. You can create your own derived type and have it return something different (after optionally calling some code). But this should only really be done in cases where the result is actually different from other results (like returning a custom file format). It is overkill for most other cases.