带有ControllerContext的ApiController中的MVC控制器

时间:2016-12-08 07:00:19

标签: asp.net-mvc rest razor

关于我在做什么以及为什么做的简短故事。我一直在Mvc项目中查看字符串转换,但突然所有项目都转移到了REST API。但是我不得不使用razor引擎将我的视图转换为所有模型数据,所以我试图直接从api使用,但它对我不起作用,所以我决定创建一个Mvc控制器并直接从API调用它,缺少什么,只有ControllerContext,因为当我直接创建控制器时,它似乎是空的。

这是我的Api控制器

public class AttachmentController : ApiController
{
    [HttpGet]
    public async Task<IHttpActionResult> Get(long id)
    {
        try
        {
            var mvcController = new AttachmentMvcController();

            var result = await mvcController.Get();

            return Ok(result);
        }
        catch (Exception e)
        {
            return InternalServerError(e);
        }
    }
}

这是我的Mvc控制器

public class AttachmentMvcController : Controller
{
    public AttachmentMvcController(){ }

    public async Task<byte[]> Get()
    {
        string result;

       // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        // HERE IS MY PROBLEM, I NEED this.ControllerContext, but it is null !!!
        if (ControllerContext == null)
        {
            // create it and do task 
            var factory = DependencyResolver.Current.GetService<IControllerFactory>() ?? new DefaultControllerFactory();
            AttachmentMvcController controller = factory.CreateController(ctx.RequestContext, "AttachmentMvc") as AttachmentMvcController;

            RouteData route = new RouteData();
            route.Values.Add("action", "ActionThatUsesControllerContext"); // ActionName, but it not required

            ControllerContext newContext = new ControllerContext(new HttpContextWrapper(System.Web.HttpContext.Current), route, controller);
            controller.ControllerContext = newContext;
            result = await controller.ActionThatUsesControllerContext(id);
        }
        else
        {
            result = await this.ActionThatUsesControllerContext(id);
        }

        return result;
    }

    private async Task<byte[]> ActionThatUsesControllerContext()
    {
        {....}
        // here I am trying to use helper that uses that controller context
        string viewAsString = ControllerContext.RenderPartialToString("MyView", requestModel);
        {....}
    }
}

如果有人知道如何获得ControllerContext或任何其他方式在ApiController中获取我的剃刀引擎渲染视图,请分享。

0 个答案:

没有答案