在 .NET Core MVC 应用程序中使用 TempData 时出现错误 500
Error 500 when using TempData in .NET Core MVC application
您好,我正在尝试将一个对象添加到 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");
}
P.S 通读可能的解决方案我在 Configure
方法中添加了 app.UseSession()
并在 ConfigureServices
方法中添加了 services.AddServices()
但没有添加 avail.Are 有什么我必须知道的模糊设置吗?
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?}");
});
}
您的 ConfigureServices() 方法中缺少 services.AddMemoryCache();
行。像这样:
services.AddMemoryCache();
services.AddSession();
services.AddMvc();
然后 TempData 应该会按预期工作。
您必须在将对象分配给 TempData 之前对其进行序列化,因为核心仅支持字符串而不支持复杂对象。
TempData["UserData"] = JsonConvert.SerializeObject(searchedStory);
并通过反序列化来检索对象。
var story = JsonConvert.DeserializeObject<Story>(TempData["searchedStory"].ToString())
像Session一样添加一个TempData扩展来序列化和反序列化
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);
}
}
我正在开发 Dot net 5.0(目前处于预览阶段)。就我而言,上述答案中提到的配置的 none 不起作用。 TempData 导致 XHR 对象在 Dot net 5.0 MVC 应用程序中收到 500 内部服务器错误。最后,我发现,缺少的部分是 AddSessionStateTempDataProvider()
`public void ConfigureServices(IServiceCollection services)
{
services.AddBrowserDetection();
services.AddDistributedMemoryCache();
services.AddSession(options =>
{
options.IdleTimeout = TimeSpan.FromSeconds(120);
});
services.AddControllersWithViews().
.AddSessionStateTempDataProvider();
}`
在使用 TempData 时添加会话很重要,因为 TempData 在内部使用 Session 变量来存储数据。在这里,@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 配置设置的更多信息,请参阅下文 post:
https://www.learnrazorpages.com/razor-pages/tempdata
您好,我正在尝试将一个对象添加到 TempData
并重定向到另一个控制器操作。使用 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 通读可能的解决方案我在 Configure
方法中添加了 app.UseSession()
并在 ConfigureServices
方法中添加了 services.AddServices()
但没有添加 avail.Are 有什么我必须知道的模糊设置吗?
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?}");
});
}
您的 ConfigureServices() 方法中缺少 services.AddMemoryCache();
行。像这样:
services.AddMemoryCache();
services.AddSession();
services.AddMvc();
然后 TempData 应该会按预期工作。
您必须在将对象分配给 TempData 之前对其进行序列化,因为核心仅支持字符串而不支持复杂对象。
TempData["UserData"] = JsonConvert.SerializeObject(searchedStory);
并通过反序列化来检索对象。
var story = JsonConvert.DeserializeObject<Story>(TempData["searchedStory"].ToString())
像Session一样添加一个TempData扩展来序列化和反序列化
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);
}
}
我正在开发 Dot net 5.0(目前处于预览阶段)。就我而言,上述答案中提到的配置的 none 不起作用。 TempData 导致 XHR 对象在 Dot net 5.0 MVC 应用程序中收到 500 内部服务器错误。最后,我发现,缺少的部分是 AddSessionStateTempDataProvider()
`public void ConfigureServices(IServiceCollection services)
{
services.AddBrowserDetection();
services.AddDistributedMemoryCache();
services.AddSession(options =>
{
options.IdleTimeout = TimeSpan.FromSeconds(120);
});
services.AddControllersWithViews().
.AddSessionStateTempDataProvider();
}`
在使用 TempData 时添加会话很重要,因为 TempData 在内部使用 Session 变量来存储数据。在这里,@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 配置设置的更多信息,请参阅下文 post: https://www.learnrazorpages.com/razor-pages/tempdata