TempData当前无法处理此请求

时间:2018-08-05 00:19:36

标签: c# asp.net-core asp.net-core-mvc tempdata

如何修复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>

1 个答案:

答案 0 :(得分:2)

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

  • 会话状态
  • 数据库表