Ошибка 500 при использовании TempData в приложении .NET Core MVC

Здравствуйте, я пытаюсь добавить объект в TempData и перенаправить на другое действие контроллера. Я получаю сообщение об ошибке 500 при использовании TempData.

public IActionResult Attach(long Id)
{
    Story searchedStory=this.context.Stories.Find(Id);
    if(searchedStory!=null)
    {
        TempData["tStory"]=searchedStory;  //JsonConvert.SerializeObject(searchedStory) gets no error and passes 

        return RedirectToAction("Index","Location");
    }
    return View("Index");
}


public IActionResult Index(object _story) 
{             
    Story story=TempData["tStory"] as Story;
    if(story !=null)
    {
    List<Location> Locations = this.context.Locations.ToList();
    ViewBag._story =JsonConvert.SerializeObject(story);
    ViewBag.rstory=story;
    return View(context.Locations);
    }
    return RedirectToAction("Index","Story");
}

P.S. Прочитав возможные решения, я добавил app.UseSession() в метод Configure и services.AddServices() в метод ConfigureServices, но безрезультатно. Есть ли какие-то неясные настройки, о которых я должен знать?

P.S добавляю ConfigureServices и UseSession

Настроить службы

 public void ConfigureServices(IServiceCollection services)
            {
                services.AddOptions();
                services.AddDbContext<TreasureContext>(x=>x.UseMySql(connectionString:Constrings[3]));
                services.AddMvc();
                services.AddSession();
            }

Настроить

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
            }

            app.UseStaticFiles();
            app.UseSession();

            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });
        }

person Bercovici Adrian    schedule 23.01.2018    source источник
comment
Опубликуйте свои методы Startup.ConfigureServices и Startup.Configure.   -  person fatherOfWine    schedule 23.01.2018
comment
Я их уже публиковал.   -  person Bercovici Adrian    schedule 24.01.2018
comment
никогда не бывает просто ошибки 500 без какого-либо сообщения об ошибке. Просмотрите свои журналы и поймите, в чем заключается фактическая ошибка. И если вы не можете найти решение, обязательно включите в свой вопрос полное сообщение об ошибке.   -  person poke    schedule 24.01.2018
comment
Обязательно прочитайте как правильно использовать TempData...   -  person Heretic Monkey    schedule 24.01.2018


Ответы (4)


Вам не хватает строки services.AddMemoryCache(); в методе ConfigureServices(). Нравится:

        services.AddMemoryCache();
        services.AddSession();
        services.AddMvc();

И после этого TempData должен работать как положено.

person fatherOfWine    schedule 24.01.2018
comment
Примечание для пользователей Asp.net Core 3 Это решение вам не подойдет. Вместо этого обратитесь к решению Agrawal Shraddha. - person Mohammed A. Fadil; 14.01.2020
comment
@MohammedA.Fadil Это решение БУДЕТ работать в приложении Mvc Core 3. Пожалуйста, изучите сначала, прежде чем комментировать. - person fatherOfWine; 15.01.2020
comment
Я провел исследование, ваше решение не сработало для меня. И после проб и ошибок решение Agrawal Shraddha отлично сработало для меня на 3.1. - person Mohammed A. Fadil; 15.01.2020
comment
При всем уважении, решение, которое я предоставил, работает в моем приложении MVC.NET Core 3 просто отлично, как мы говорим. :) Итак, сказать, что это решение не будет работать для пользователей Asp.net Core 3, немного натянуто, потому что приложение, над которым я работаю, противоречит вашему утверждению. Удачного программирования! :) - person fatherOfWine; 15.01.2020
comment
Ничего личного, бро. Удачи - person Mohammed A. Fadil; 16.01.2020

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

TempData["UserData"] = JsonConvert.SerializeObject(searchedStory);

и получить объект, десериализовав его.

var story = JsonConvert.DeserializeObject<Story>(TempData["searchedStory"].ToString())
person Agrawal Shraddha    schedule 06.02.2018
comment
Это была моя проблема, и это сводило меня с ума. Использование сложного объекта заставило меня вернуть ошибку 500 без каких-либо исключений или объяснений того, что он возвращал 500. Сериализация - это путь. - person FerX32; 16.07.2018
comment
Работал отлично. Спасибо за спасение дня :D - person Mohammed A. Fadil; 14.01.2020

Я работаю над сетью Dot 5.0 (которая в настоящее время находится в предварительной версии). В моем случае ни одна из конфигураций, упомянутых в приведенных выше ответах, не сработала. TempData приводил к тому, что объект XHR получал ошибку внутреннего сервера 500 в приложении Dot net 5.0 MVC. Наконец, я обнаружил, что отсутствующей частью была AddSessionStateTempDataProvider().

`public void ConfigureServices(IServiceCollection services)
        {
            services.AddBrowserDetection();
            services.AddDistributedMemoryCache();

            services.AddSession(options =>
            {
                options.IdleTimeout = TimeSpan.FromSeconds(120);
            });

            services.AddControllersWithViews().
                .AddSessionStateTempDataProvider();
        }`

Важно добавлять сеансы при использовании TempData, поскольку TempData внутренне использует переменную сеанса для хранения данных. Здесь ответ @Agrawal Shraddha также очень актуален. Asp.Net Core/Dot net 5.0 не поддерживает TempData для непосредственного хранения сложных объектов. Вместо этого он должен сериализоваться в строку Json и должен быть снова десериализован при его извлечении.

`TempData[DATA] = JsonConvert.SerializeObject(dataObject);`

И метод Configure(), как показано ниже:

`public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

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

            app.UseRouting();

            app.UseAuthorization();

            app.UseSession();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");
            });
        }
`

Дополнительные сведения о параметрах конфигурации TempData, чтобы заставить их работать, см. в сообщении ниже: https://www.learnrazorpages.com/razor-pages/tempdata

person Sadashiv J P    schedule 28.09.2020

Добавьте расширение TempData, как и Session, для сериализации и десериализации.

    public static class TempDataExtensions
    {
        public static void Set<T>(this ITempDataDictionary tempData, string key, T value)
        {
           string json = JsonConvert.SerializeObject(value);
           tempData.Add(key, json);
        }

        public static T Get<T>(this ITempDataDictionary tempData, string key)
        {
            if (!tempData.ContainsKey(key)) return default(T);

            var value = tempData[key] as string;

            return value == null ? default(T) :JsonConvert.DeserializeObject<T>(value);
        }
    }
person user370844    schedule 22.08.2018