C# 在.NET Core MVC应用程序中使用TempData时出现错误500

C# 在.NET Core MVC应用程序中使用TempData时出现错误500,c#,asp.net-core,tempdata,C#,Asp.net Core,Tempdata,您好,我正在尝试向TempData添加一个对象,并重定向到另一个控制器操作。使用TempData时,我收到错误消息500 public IActionResult Attach(long Id) { Story searchedStory=this.context.Stories.Find(Id); if(searchedStory!=null) { TempData["tStory"]=searchedStory; //JsonConvert.Seri

您好,我正在尝试向
TempData
添加一个对象,并重定向到另一个控制器操作。使用
TempData
时,我收到错误消息500

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");
}
配置

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?}");
            });
        }

您缺少
服务。AddMemoryCache()行。像这样:

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

在那之后,TempData应该按预期工作

在将对象分配给TempData之前,必须将其序列化,因为核心仅支持字符串而不支持复杂对象

TempData["UserData"] = JsonConvert.SerializeObject(searchedStory);
并通过反序列化来检索对象

var story = JsonConvert.DeserializeObject<Story>(TempData["searchedStory"].ToString())
var story=JsonConvert.DeserializeObject(TempData[“searchedStory”].ToString())

添加一个TempData扩展,就像sessession一样进行序列化和反序列化

    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);
        }
    }
公共静态类TempDataExtensions
{
公共静态无效集(此ITempDataDictionary tempData、字符串键、T值)
{
字符串json=JsonConvert.SerializeObject(值);
Add(key,json);
}
公共静态T Get(此ITempDataDictionary tempData,字符串键)
{
如果(!tempData.ContainsKey(key))返回默认值(T);
var value=tempData[key]作为字符串;
返回值==null?默认值(T):JsonConvert.DeserializeObject(值);
}
}

我正在开发Dot net 5.0(目前正在预览中)。在我的情况下,上述答案中提到的配置都不起作用。TempData导致XHR对象在Dot net 5.0 MVC应用程序中收到500个内部服务器错误。最后,我发现缺少的部分是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配置设置的更多信息,请参阅下面的帖子:

请发布您的Startup.ConfigureServices和Startup.Configure方法。我已经发布了它们。没有错误消息的情况下,永远不会出现错误500。查看日志,了解实际错误是什么。如果你找不到解决方案,请确保在你的问题中包含完整的错误信息。请务必仔细阅读…这是我的问题,让我发疯。使用复杂对象导致我返回了500个错误,没有任何异常,也没有解释它返回的500个错误。把它连载是一个好办法,效果很好。感谢您为Asp.net Core 3用户节省时间:DA注意此解决方案不适用于您,请参阅Agrawal Shraddha解决方案。@MohammedA.Fadil此解决方案将在Mvc Core 3应用程序中工作。请在评论之前先进行研究。我做了我的研究,你的解决方案对我不起作用。经过反复试验,Agrawal Shraddha解决方案在3.1上对我非常有效,我提供的解决方案在我的MVC.NET Core 3应用程序中的效果与我们所说的一样好。:)所以说,“这个解决方案不适用于Asp.NET Core 3用户”有点牵强,因为我正在开发的应用程序与您的声明存在矛盾。快乐编程!:)没什么私事,兄弟。祝你好运
`TempData[DATA] = JsonConvert.SerializeObject(dataObject);`
`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?}");
            });
        }
`