Как разрешить Microsoft.AspNetCore.Mvc.Internal.ActionContext.GetNormalizedRouteValue в .Net Core 2.2 - PullRequest
2 голосов
/ 04 июня 2019

Microsoft.AspNetCore.Mvc.Internal.ActionContext.GetNormalizedRouteValue () не существует

Я реализую пользовательский Razor ViewEngine в .net Core 2.2.

MSDN заявляет, что метод GetNormalizedRouteValue() существует в Microsoft.AspNetCore.Mvc.Internal для .Net Core 2.2, но, похоже, его не существует, когда я компилирую или проверяю сборку.

Мой код

Мой контекст кода, в котором я использую, это context.GetNormalizedRouteValue(AREA_KEY)

public class CustomViewEngine : IViewEngine
{
 public ViewEngineResult FindView(ActionContext context, string viewName, bool isMainPage)
        {
            var controllerName = context.GetNormalizedRouteValue(CONTROLLER_KEY);
            var areaName = context.GetNormalizedRouteValue(AREA_KEY);

            var checkedLocations = new List<string>();
            foreach (var location in _options.ViewLocationFormats)
            {
                var view = string.Format(location, viewName, controllerName);
                if (File.Exists(view))
                {
                    return ViewEngineResult.Found("Default", new CustomView(view, _customViewRendering));
                }
                checkedLocations.Add(view);
            }

            return ViewEngineResult.NotFound(viewName, checkedLocations);
        }

API Microsoft

При проверке Microsoft API, только следующий методподписи, по-видимому, существуют.

namespace Microsoft.AspNetCore.Mvc
{

    public class ActionContext
    {

        public ActionContext();

        public ActionContext(ActionContext actionContext);

        public ActionContext(HttpContext httpContext, RouteData routeData, ActionDescriptor actionDescriptor);

        public ActionContext(HttpContext httpContext, RouteData routeData, ActionDescriptor actionDescriptor, ModelStateDictionary modelState);

        public ActionDescriptor ActionDescriptor { get; set; }

        public HttpContext HttpContext { get; set; }

        public ModelStateDictionary ModelState { get; }

        public RouteData RouteData { get; set; }
    }
}

Я проверил Документацию MSDN и указывает, что она должна существовать.

Ошибка

'ActionContext »не содержит определения для« GetNormalizedRouteValue », и нет доступного метода расширения« GetNormalizedRouteValue », принимающего первый аргумент типа« ActionContext », (вы пропустили директиву using или ссылку на сборку?)

Ответы [ 2 ]

1 голос
/ 04 июня 2019

Вам нужно внести некоторые изменения в ваш код. Убедитесь, что вы используете метод

Microsoft.AspNetCore.Mvc.Razor

GetNormalizedRouteValue теперь общедоступен.Таким образом, вы можете вызвать метод RazorViewEngine.GetNormalizedRouteValue

Заменить следующую строку

 var controllerName = context.GetNormalizedRouteValue(CONTROLLER_KEY);

Ваш метод будет выглядеть следующим образом

 public ViewEngineResult FindView(ActionContext context, string viewName, bool isMainPage)
  {
   var controllerName = RazorViewEngine.GetNormalizedRouteValue(context, CONTROLLER_KEY);
   var areaName = RazorViewEngine.GetNormalizedRouteValue(context, AREA_KEY)             
                //your code
    }

Mircosoft API

namespace Microsoft.AspNetCore.Mvc.Razor
{

    public class RazorViewEngine : IRazorViewEngine, IViewEngine
    {
        public static readonly string ViewExtension;
        protected IMemoryCache ViewLookupCache { get; }
        public static string GetNormalizedRouteValue(ActionContext context, string key);
        public RazorPageResult FindPage(ActionContext context, string pageName);
        public ViewEngineResult FindView(ActionContext context, string viewName, bool isMainPage);
        public string GetAbsolutePath(string executingFilePath, string pagePath);
        public RazorPageResult GetPage(string executingFilePath, string pagePath);
        public ViewEngineResult GetView(string executingFilePath, string viewPath, bool isMainPage);
    }
}
1 голос
/ 04 июня 2019

Метод GetNormalizedRouteValue() равен static и определен для типа Microsoft.AspNetCore.Mvc.Internal.NormalizedRouteValue.

Попробуйте вместо этого:

var controllerName = NormalizedRouteValue.GetNormalizedRouteValue(context, CONTROLLER_KEY);

См. MSDN

...