如何修复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>
答案 0 :(得分:2)
500错误总是带有异常详细信息,该异常详细信息应该告诉您什么地方!因此,请检查异常/内部异常,以查看代码崩溃的原因。我还建议您使用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)保留数据并再次读取。 您可以将数据存储在某处,然后再次读取。这里有两个可供考虑的选择。