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