.net core 在.Net 5中找不到IActionSelectorDecisionTreeProvider命名空间

.net core 在.Net 5中找不到IActionSelectorDecisionTreeProvider命名空间,.net-core,.net-5,.net Core,.net 5,我想创建@Html.Action的扩展方法,但IActionSelectorDecisionTreeProvider显示错误,无法加载命名空间 var actionSelector = GetServiceOrFail<IActionSelectorDecisionTreeProvider>(currentHttpContext); 但是运气不好。在Dot Net 5中运行代码 public static class HtmlHelperViewExtensions {

我想创建@Html.Action的扩展方法,但IActionSelectorDecisionTreeProvider显示错误,无法加载命名空间

  var actionSelector = GetServiceOrFail<IActionSelectorDecisionTreeProvider>(currentHttpContext);

但是运气不好。

在Dot Net 5中运行代码

public static class HtmlHelperViewExtensions
{

    public static IHtmlContent RenderAction(this IHtmlHelper helper, string action, object parameters = null)
    {
        var controller = (string)helper.ViewContext.RouteData.Values["controller"];

        return RenderAction(helper, action, controller, parameters);
    }

    public static IHtmlContent RenderAction(this IHtmlHelper helper, string action, string controller, object parameters = null)
    {
        var area = (string)helper.ViewContext.RouteData.Values["area"];

        return RenderAction(helper, action, controller, area, parameters);
    }

    public static IHtmlContent RenderAction(this IHtmlHelper helper, string action, string controller, string area, object parameters = null)
    {
        if (action == null)
            throw new ArgumentNullException("action");

        if (controller == null)
            throw new ArgumentNullException("controller");

        //if (area == null)
        //    throw new ArgumentNullException("area");

        var task = RenderActionAsync(helper, action, controller, area, parameters);

        return task.Result;
    }

    private static async Task<IHtmlContent> RenderActionAsync(this IHtmlHelper helper, string action, string controller, string area, object parameters = null)
    {
        // fetching required services for invocation
        var currentHttpContext = helper.ViewContext?.HttpContext;
        var httpContextFactory = GetServiceOrFail<IHttpContextFactory>(currentHttpContext);
        var actionInvokerFactory = GetServiceOrFail<IActionInvokerFactory>(currentHttpContext);
        var actionSelector = GetServiceOrFail<IActionDescriptorCollectionProvider>(currentHttpContext);

        // creating new action invocation context
        var routeData = new RouteData();
        var routeParams = new RouteValueDictionary(parameters ?? new { });
        var routeValues = new RouteValueDictionary(new { area = area, controller = controller, action = action });
        var newHttpContext = httpContextFactory.Create(currentHttpContext.Features);

        newHttpContext.Response.Body = new MemoryStream();

        foreach (var router in helper.ViewContext.RouteData.Routers)
            routeData.PushState(router, null, null);

        routeData.PushState(null, routeValues, null);
        routeData.PushState(null, routeParams, null);

        var actionDescriptor = actionSelector.ActionDescriptors.Items.Where(i => i.RouteValues["controller"] == controller && i.RouteValues["action"] == action).First();
        var actionContext = new ActionContext(newHttpContext, routeData, actionDescriptor);

        // invoke action and retreive the response body
        var invoker = actionInvokerFactory.CreateInvoker(actionContext);
        string content = null;

        await invoker.InvokeAsync().ContinueWith(task => {
            if (task.IsFaulted)
            {
                content = task.Exception.Message;
            }
            else if (task.IsCompleted)
            {
                newHttpContext.Response.Body.Position = 0;
                using (var reader = new StreamReader(newHttpContext.Response.Body))
                    content = reader.ReadToEnd();
            }
        });

        return new HtmlString(content);
    }

    private static TService GetServiceOrFail<TService>(HttpContext httpContext)
    {
        if (httpContext == null)
            throw new ArgumentNullException(nameof(httpContext));

        var service = httpContext.RequestServices.GetService(typeof(TService));

        if (service == null)
            throw new InvalidOperationException($"Could not locate service: {nameof(TService)}");

        return (TService)service;
    }
公共静态类HtmlHelpViewExtensions
{
公共静态IHtmlContent RenderAction(此IHtmlHelper帮助程序,字符串操作,对象参数=null)
{
var controller=(string)helper.ViewContext.RouteData.Values[“controller”];
返回渲染(助手、动作、控制器、参数);
}
公共静态IHtmlContent RenderAction(此IHtmlHelper帮助程序、字符串操作、字符串控制器、对象参数=null)
{
var area=(string)helper.ViewContext.RouteData.Values[“area”];
返回渲染(辅助对象、动作、控制器、区域、参数);
}
公共静态IHTML内容呈现(此IHTML帮助器、字符串操作、字符串控制器、字符串区域、对象参数=null)
{
if(action==null)
抛出新的异常(“操作”);
如果(控制器==null)
抛出新的异常(“控制器”);
//如果(面积==null)
//抛出新的异常(“区域”);
var task=RenderActionAsync(助手、操作、控制器、区域、参数);
返回任务。结果;
}
专用静态异步任务RenderActionAsync(此IHtmlHelper帮助程序、字符串操作、字符串控制器、字符串区域、对象参数=null)
{
//获取调用所需的服务
var currentHttpContext=helper.ViewContext?.HttpContext;
var httpContextFactory=GetServiceOrFail(currentHttpContext);
var actionInvokerFactory=GetServiceOrFail(currentHttpContext);
var actionSelector=GetServiceOrFail(currentHttpContext);
//创建新的操作调用上下文
var routeData=新routeData();
var routeParams=新的RouteValueDictionary(参数??新{});
var routeValues=new RouteValueDictionary(new{area=area,controller=controller,action=action});
var newHttpContext=httpContextFactory.Create(currentHttpContext.Features);
newHttpContext.Response.Body=newMemoryStream();
foreach(helper.ViewContext.RoutedData.Routers中的var路由器)
PushState(路由器,空,空);
PushState(null,routeValue,null);
routeData.PushState(null,routeParams,null);
var actionDescriptor=actionSelector.ActionDescriptors.Items.Where(i=>i.RouteValues[“controller”]==controller&&i.RouteValues[“action”]==action).First();
var actionContext=newactioncontext(newHttpContext、routeData、actionDescriptor);
//调用操作并检索响应体
var invoker=actionInvokerFactory.CreateInvoker(actionContext);
字符串内容=null;
wait invoker.InvokeAsync().ContinueWith(任务=>{
if(task.IsFaulted)
{
内容=task.Exception.Message;
}
else if(任务已完成)
{
newHttpContext.Response.Body.Position=0;
使用(var reader=newstreamreader(newHttpContext.Response.Body))
content=reader.ReadToEnd();
}
});
返回新的HtmlString(内容);
}
专用静态TService GetServiceOrFail(HttpContext HttpContext)
{
if(httpContext==null)
抛出新ArgumentNullException(nameof(httpContext));
var service=httpContext.RequestServices.GetService(typeof(TService));
if(服务==null)
抛出新的InvalidOperationException($“找不到服务:{nameof(TService)}”);
返回(TService)服务;
}

}

使用Microsoft.AspNetCore.Mvc.Infrastructure;替换
//var actionSelector=GetServiceOrFail(currentHttpContext);var actionSelector=GetServiceOrFail(currentHttpContext)它正在工作,但我们需要更新代码行,我想在其中使用
var actionDescriptor=actionSelector.ActionDescriptors.Items.where(I=>I.RouteValues[“controller”]==controller&&I.RouteValues[“action”]==action)。First()
public static class HtmlHelperViewExtensions
{

    public static IHtmlContent RenderAction(this IHtmlHelper helper, string action, object parameters = null)
    {
        var controller = (string)helper.ViewContext.RouteData.Values["controller"];

        return RenderAction(helper, action, controller, parameters);
    }

    public static IHtmlContent RenderAction(this IHtmlHelper helper, string action, string controller, object parameters = null)
    {
        var area = (string)helper.ViewContext.RouteData.Values["area"];

        return RenderAction(helper, action, controller, area, parameters);
    }

    public static IHtmlContent RenderAction(this IHtmlHelper helper, string action, string controller, string area, object parameters = null)
    {
        if (action == null)
            throw new ArgumentNullException("action");

        if (controller == null)
            throw new ArgumentNullException("controller");

        //if (area == null)
        //    throw new ArgumentNullException("area");

        var task = RenderActionAsync(helper, action, controller, area, parameters);

        return task.Result;
    }

    private static async Task<IHtmlContent> RenderActionAsync(this IHtmlHelper helper, string action, string controller, string area, object parameters = null)
    {
        // fetching required services for invocation
        var currentHttpContext = helper.ViewContext?.HttpContext;
        var httpContextFactory = GetServiceOrFail<IHttpContextFactory>(currentHttpContext);
        var actionInvokerFactory = GetServiceOrFail<IActionInvokerFactory>(currentHttpContext);
        var actionSelector = GetServiceOrFail<IActionDescriptorCollectionProvider>(currentHttpContext);

        // creating new action invocation context
        var routeData = new RouteData();
        var routeParams = new RouteValueDictionary(parameters ?? new { });
        var routeValues = new RouteValueDictionary(new { area = area, controller = controller, action = action });
        var newHttpContext = httpContextFactory.Create(currentHttpContext.Features);

        newHttpContext.Response.Body = new MemoryStream();

        foreach (var router in helper.ViewContext.RouteData.Routers)
            routeData.PushState(router, null, null);

        routeData.PushState(null, routeValues, null);
        routeData.PushState(null, routeParams, null);

        var actionDescriptor = actionSelector.ActionDescriptors.Items.Where(i => i.RouteValues["controller"] == controller && i.RouteValues["action"] == action).First();
        var actionContext = new ActionContext(newHttpContext, routeData, actionDescriptor);

        // invoke action and retreive the response body
        var invoker = actionInvokerFactory.CreateInvoker(actionContext);
        string content = null;

        await invoker.InvokeAsync().ContinueWith(task => {
            if (task.IsFaulted)
            {
                content = task.Exception.Message;
            }
            else if (task.IsCompleted)
            {
                newHttpContext.Response.Body.Position = 0;
                using (var reader = new StreamReader(newHttpContext.Response.Body))
                    content = reader.ReadToEnd();
            }
        });

        return new HtmlString(content);
    }

    private static TService GetServiceOrFail<TService>(HttpContext httpContext)
    {
        if (httpContext == null)
            throw new ArgumentNullException(nameof(httpContext));

        var service = httpContext.RequestServices.GetService(typeof(TService));

        if (service == null)
            throw new InvalidOperationException($"Could not locate service: {nameof(TService)}");

        return (TService)service;
    }