ViewContext.RouteData.Values ​​["Controller"] всегда пусто - Asp.Net Core 2.1 - PullRequest
0 голосов
/ 12 ноября 2018

Я начал со стандартного шаблона ASP.NET Core Web Application, используя Asp.Net Core 2.1 в качестве отправной точки.

Затем я добавил левую панель навигации в общую папку следующим образом: ActiveRouteTagHelper

В этой панели навигации я хочу выделить активную ссылку, и я использовал следующее решение: ActiveRouteTagHelper Бена Калла для MVC .

А потом я столкнулся со следующей проблемой:

Когда я нажму отладку и приложение запустится, я ожидаю увидеть значение контроллера в ViewContext.RouteData.Values["Controller"].

Для первого и любого другого щелчка, хотя видно, что Url отображает правильное действие и имя контроллера

    private bool ShouldBeActive()
    {
        try
        {
            var currentController = ViewContext.RouteData.Values["Controller"].ToString();
            var currentAction = ViewContext.RouteData.Values["Action"].ToString();


        }
        catch (Exception ex)
        {
            return false;
        }
    }

Я удалил остальную часть метода для ясности.

Мой Startup Класс:

        public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<AppSettings>(_configuration);
        services.Configure<AppSettings>(_configuration.GetSection("PortalSettings"));
        var settings = _configuration.Get<AppSettings>();

        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
        services.AddMvc();
        services.AddMvc().AddControllersAsServices();
        services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            // If this is the case then enable more detailed error output
            app.UseDeveloperExceptionPage();

            // Display a more specific error page when an exception occurs connecting to the database
            app.UseDatabaseErrorPage();
        }
        else
        {
            // If this is not the case then forward the error to our generic view
            app.UseExceptionHandler("/Shared/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseMvc(routes =>
        {
            routes.MapRoute("default", "{controller}/{action}/{id?}");
        });
        app.UseAuthentication();
    }

У меня такой вопрос, как мне получить, чтобы эти две строки возвращали значение? Как бы то ни было, что я попробовал, оказалось успешным. Результат всегда нулевой!

var currentController = ViewContext.RouteData.Values["Controller"].ToString();
var currentAction = ViewContext.RouteData.Values["Action"].ToString();

Отладка

Я пробовал различные варианты отображения маршрутизации, но безрезультатно. Есть идеи?

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Я не знаю, является ли это правильным способом сделать это или нет, но я нашел это сообщение в блоге , которое показывает, как заставить этот помощник тега работать с Razor Pages.

0 голосов
/ 12 ноября 2018

Вы путаете Razor Pages и MVC. Шаблон веб-приложения по умолчанию для ASP.NET Core предоставляет вам приложение Razor Pages (https://www.learnrazorpages.com), и, согласно изображениям, которые вы разместили, это то, что вы получили.

Маршрутизация в Razor Pages определяется в соответствии с путями к файлам содержимого в папке Pages, а не с контроллерами и методами действий. Если вы хотите приложение MVC, выберите Базовое веб-приложение ASP.NET в качестве типа проекта, затем выберите Веб-приложение (Model-View-Controller) .

...