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 中传递复杂类型。您可以传递 stringintGuid 等简单类型。这是设计使然。

如果您绝对想在 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