【问题标题】:Asp.net core HTTP 500 ERROR When TemData.Keep() is Used使用 TemData.Keep() 时的 Asp.net 核心 HTTP 500 错误
【发布时间】:2021-08-18 17:29:34
【问题描述】:

城市控制器

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using MVC.Models;

namespace MVC.Controllers
{
    public class CityController : Controller
    {
        private readonly ILogger<CityController> _logger;

        public CityController(ILogger<CityController> logger)
        {
            _logger = logger;
        }

        public IActionResult CitiesOnMap()
        {

            List<City> cities = new List<City>();

           cities.Add(new City { CityName = "Hatay", Latitude = 123, Longtitude = 435 });
           cities.Add(new City { CityName = "Konya", Latitude = 123, Longtitude = 435 });
           cities.Add(new City { CityName = "Istanbul", Latitude = 123, Longtitude = 435 });
           cities.Add(new City { CityName = "Izmir", Latitude = 123, Longtitude = 435 });
           cities.Add(new City { CityName = "Samsun", Latitude = 123, Longtitude = 435 });
           cities.Add(new City { CityName = "Antalya", Latitude = 123, Longtitude = 435 });
           cities.Add(new City { CityName = "Bursa", Latitude = 123, Longtitude = 435 });
           cities.Add(new City { CityName = "Manisa", Latitude = 123, Longtitude = 435 });
           cities.Add(new City { CityName = "Mersin", Latitude = 123, Longtitude = 435 });
           cities.Add(new City { CityName = "Ankara", Latitude = 123, Longtitude = 435 });
  
           TempData["cities"] = cities;
           return View(); 
        }

       
        [HttpPost]
        public IActionResult CitiesOnMap(string SelectedCity)
        {

            if (TempData["cities"] != null)
            {
                foreach (var redirectedCity in TempData["cities"] as List<City>)
                {
                    
                    if (String.Equals(redirectedCity.CityName, SelectedCity))
                    {

                        TempData["selectedCity"] = redirectedCity;
                        return RedirectToAction(redirectedCity.CityName, "City");
                    }


                }
            }


            return RedirectToAction(SelectedCity, "City"); ;
        }




        public IActionResult Hatay()
        {
            return View();
        }



        [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
        public IActionResult Error()
        {
            return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
        }
    }
}

在我的索引页面中,有一个下拉菜单可以选择地图。用户选择一张地图并单击按钮,然后我使用 RedirectToAction 使用此 CityController 重定向 CitiesOnMap.cshtml。

CitiesOnMap.cshtml

@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@{
    ViewData["Title"] = "CitiesOnMap";
}



<div class="text-center pt-5">
    <h1 class="display-4 pb-2 ">LET'S SEE THE CITIES!</h1>
    <p class="pb-3">Now, Please Choose A City You Want to See on Map.</p>
    <h3> @TempData["SelectedMap"] </h3>

    <div class="text-center mx-auto pt-5">
        <form asp-action="CitiesOnMap" asp-controller="City" method="post">

            <div class="row">
                <div class="col-9 mx-auto">
                    <select id="drpEmpList" name="SelectedCity" class="form-control">
                        <option disabled selected hidden>Choose a City </option>

                        @foreach (var name in TempData["cities"] as List<MVC.Models.City>)
                        {

                            <option>@name.CityName </option>
                        }
                        
                    </select>
                    

                    <input type="hidden" />

                </div>
            </div>
            <div class="row">
                <div class="col-md-12 pt-4">

                    <input type="submit" name="btnSubmit" value="Let's See" class="btn btn-success btn-lg" />
                </div>
            </div>

        </form>
    </div>
</div>


我正在发送城市列表,这是我的城市模型的类。在此页面上,用户从 CitiesOnMap.cshtml 文件的下拉列表中选择一个城市。选择后,我想将用户重定向到正确的城市页面。但是当用户选择提交按钮时,如果我不使用 TempData["cities"].Keep() 方法,.net 会抛出 NullReferenceError,因为据我所知,在使用后我无法再次保留我的数据。如果我使用 TempData["cities"].Keep() 方法,我会收到 HTTP 500 错误。而且我认为我必须序列化我的 TempData["cities"] 但我很困惑我有很多问题:(请帮助我

【问题讨论】:

  • HTTP 500 -> 内部服务器错误 -> 查看日志中是否存在未处理的异常
  • @CamiloTerevinto 我该怎么做?我是初级水平

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


【解决方案1】:

首先,您的代码犯了一个错误,您无法通过 TempData["KeyName"] 重定向到另一个控制器操作。否则会返回 500 错误并显示如下错误信息。这是因为 TempData 使用了 Session,而 Session 本身使用了 IDistributedCacheIDistributedCache 不具备接受对象或序列化对象的能力:

InvalidOperationException: The 'Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.TempDataSerializer' cannot serialize an object of type ....

这是一个使用 JSON.Net 的工作演示(您也可以使用 System.Text.Json):

public IActionResult CitiesOnMap()
{

    List<City> cities = new List<City>();
    //....
    cities.Add(new City { CityName = "Ankara", Latitude = 123, Longtitude = 435 });
    //Serialize manually by JSON.Net....        
    TempData["cities"] = Newtonsoft.Json.JsonConvert.SerializeObject(cities);  
    TempData.Keep("cities");  
    return View();
}
[HttpPost]
public IActionResult CitiesOnMap(string SelectedCity)
{
    if (TempData["cities"] != null)
    {
        foreach (var redirectedCity in JsonConvert.DeserializeObject<List<City>>(TempData["cities"] as string))
        {
            if (String.Equals(redirectedCity.CityName, SelectedCity))
            {
                //not sure what is your selected city page
                //but if you redirect to another action
                //you also need to serialize the model data manually
                TempData["selectedCity"] = JsonConvert.SerializeObject(redirectedCity);                
                return RedirectToAction(redirectedCity.CityName, "City");
            }
        }
    }
    return RedirectToAction(SelectedCity, "City"); ;
}

CitiesOnMap.cshtml:

<form asp-action="CitiesOnMap" asp-controller="City" method="post">
    <div class="row">
        <div class="col-9 mx-auto">
            <select id="drpEmpList" name="SelectedCity" class="form-control">
                <option disabled selected hidden>Choose a City </option>

                @foreach (var name in         
Newtonsoft.Json.JsonConvert.DeserializeObject<List<MVC.Models.City>>(TempData["cities"] as string))
                {
                    <option>@name.CityName </option>
                }

            </select>
        </div>
    </div>

</form>

【讨论】:

  • 天哪,非常感谢。但我可以再问一个问题吗?我重定向到正确的城市页面,但在这里,我如何将 TempData["selectedCity"] 对象用于我的城市视图?我尝试了一些方法,但出现“无法反序列化”错误 :( 这是我的城市视图:``` @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers @{ ViewData["Title"] = "CitiesOnMap"; var selectedCity = Newtonsoft .Json.JsonConvert.DeserializeObject(TempData["cities"] as string); }

    所选城市:@selectedCity.CityName

    ```
  • 嗨@Mertcan,您是否在后端修改过:TempData["selectedCity"] = JsonConvert.SerializeObject(redirectedCity);?此外,在前端,它是TempData["selectedCity"],但你使用TempData["cities"]
  • lool 对不起,是的,我刚刚将城市更改为 selectedCity 并已修复。真的非常感谢你,从昨天开始我就一直在遭受这些错误:(
猜你喜欢
  • 2018-03-12
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 2019-05-28
  • 2017-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多