TempData 当前无法处理此请求
TempData currently unable to handle this request
如何修复 TempData 不工作,页面重定向到 localhost is currently unable to handle this request.
HTTP ERROR 500
我想要实现的是创建一个接受模型的表单,并且可以添加多个数据,我想在将模型全部插入数据库之前将模型的临时列表存储到TempData
,我得到了卡在这个问题上。我怎么可能解决这个问题?我错过了什么吗?
这是我的 Startup.cs
代码:
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
//some code here
//services.AddMvc();
services.AddMvc().AddSessionStateTempDataProvider();
services.AddSession();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
//some code here
app.UseSession();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
控制器代码:
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Create1(BooksViewModel vmodel, Books books)
{
if (ModelState.IsValid)
{
//some code here
TempData["BooksViewModel"] = books;
return RedirectToAction(nameof(Entry));
}
return View();
}
public IActionResult Entry()
{
BooksViewModel vmodel = (BooksViewModel)TempData["BooksViewModel"];
List<BooksViewModel> list = new List<BooksViewModel>();
list = (List<BooksViewModel>)TempData["BooksViewModelList"];
if (vmodel != null)
{
//some code here
}
TempData["BooksViewModelList"] = list;
return View(list);
}
Entry.cshtml代码:
@model IEnumerable<QnE_Accounting.Models.TransactionsViewModel.BooksViewModel>
<p>
<a asp-action="Create">Create New</a>
</p>
<table class="table">
<thead>
<tr>
//some code here
<th></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model) {
<tr>
//some code here
<td>
<a asp-action="Edit" asp-route-id="@item.Id">Edit</a> |
<a asp-action="Details" asp-route-id="@item.Id">Details</a> |
<a asp-action="Delete" asp-route-id="@item.Id">Delete</a>
</td>
</tr>
}
</tbody>
</table>
500 错误总是带有异常详细信息,应该告诉您哪里出了问题!因此,请检查 exception/inner 异常以查看您的代码崩溃的原因。我还建议您使用 visual studio 断点并检查 C# 表达式(您的代码)以查看它是否具有预期的值。
关于 TempData,在 Asp.Net 内核中,您不能在 TempData 中传递复杂类型。您可以传递 string
、int
、Guid
等简单类型。这是设计使然。
如果您绝对想在 2 个操作方法之间传递一个复杂类型的对象,您有几个选择
1) 将您的对象序列化为字符串并传递它。
var booksString = Newtonsoft.Json.JsonConvert.SerializeObject(books);
TempData["books"] = booksString;
return RedirectToAction("Entry");
并且在您的 Entry
操作中,您将从 TempData 读取并将字符串反序列化回您的对象。
public IActionResult Entry()
{
var tempDataStr = TempData["books"] as string;
// De serialize the string to object
var books = Newtonsoft.Json.JsonConvert.DeserializeObject<Books>(tempDataStr);
// Use books
// to do : return something
}
2)持久化数据,再读取
您可以将数据存储在某处并再次读取。这里有 2 个选项可供考虑。
- 会话状态
- 数据库table
如何修复 TempData 不工作,页面重定向到 localhost is currently unable to handle this request.
HTTP ERROR 500
我想要实现的是创建一个接受模型的表单,并且可以添加多个数据,我想在将模型全部插入数据库之前将模型的临时列表存储到TempData
,我得到了卡在这个问题上。我怎么可能解决这个问题?我错过了什么吗?
这是我的 Startup.cs
代码:
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
//some code here
//services.AddMvc();
services.AddMvc().AddSessionStateTempDataProvider();
services.AddSession();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
//some code here
app.UseSession();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
控制器代码:
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Create1(BooksViewModel vmodel, Books books)
{
if (ModelState.IsValid)
{
//some code here
TempData["BooksViewModel"] = books;
return RedirectToAction(nameof(Entry));
}
return View();
}
public IActionResult Entry()
{
BooksViewModel vmodel = (BooksViewModel)TempData["BooksViewModel"];
List<BooksViewModel> list = new List<BooksViewModel>();
list = (List<BooksViewModel>)TempData["BooksViewModelList"];
if (vmodel != null)
{
//some code here
}
TempData["BooksViewModelList"] = list;
return View(list);
}
Entry.cshtml代码:
@model IEnumerable<QnE_Accounting.Models.TransactionsViewModel.BooksViewModel>
<p>
<a asp-action="Create">Create New</a>
</p>
<table class="table">
<thead>
<tr>
//some code here
<th></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model) {
<tr>
//some code here
<td>
<a asp-action="Edit" asp-route-id="@item.Id">Edit</a> |
<a asp-action="Details" asp-route-id="@item.Id">Details</a> |
<a asp-action="Delete" asp-route-id="@item.Id">Delete</a>
</td>
</tr>
}
</tbody>
</table>
500 错误总是带有异常详细信息,应该告诉您哪里出了问题!因此,请检查 exception/inner 异常以查看您的代码崩溃的原因。我还建议您使用 visual studio 断点并检查 C# 表达式(您的代码)以查看它是否具有预期的值。
关于 TempData,在 Asp.Net 内核中,您不能在 TempData 中传递复杂类型。您可以传递 string
、int
、Guid
等简单类型。这是设计使然。
如果您绝对想在 2 个操作方法之间传递一个复杂类型的对象,您有几个选择
1) 将您的对象序列化为字符串并传递它。
var booksString = Newtonsoft.Json.JsonConvert.SerializeObject(books);
TempData["books"] = booksString;
return RedirectToAction("Entry");
并且在您的 Entry
操作中,您将从 TempData 读取并将字符串反序列化回您的对象。
public IActionResult Entry()
{
var tempDataStr = TempData["books"] as string;
// De serialize the string to object
var books = Newtonsoft.Json.JsonConvert.DeserializeObject<Books>(tempDataStr);
// Use books
// to do : return something
}
2)持久化数据,再读取 您可以将数据存储在某处并再次读取。这里有 2 个选项可供考虑。
- 会话状态
- 数据库table