TempData 值在 RedirectToAction() 之后从 List<string> 隐式转换为 string[]

m3h*_*h0w 4 c# asp.net-core-mvc asp.net-core

我正在使用 TempData 允许在重定向后显示错误消息。为了兼容性,我使用 aList<string>将消息添加到 NotificationHelper 类中的错误列表中:

if (TempData["errorNotification"] == null) {
    TempData["errorNotification"] = new List<string> {
        message
    };
} else {
    var data = (List<string>) TempData["errorNotification"];
    data.Add(message);
    TempData["errorNotification"] = data;
}
Run Code Online (Sandbox Code Playgroud)

在控制器内部,我用错误消息填充该 TempData,在return RedirectToAction()调用之前,TempData 包含一个字典记录List<string>(准确地说:)System.Collections.Generic.List`1[System.String]作为值,但在调用之后,在Terms()函数内部,该值变为数组 ( System.String[])。

[HttpGet]
public IActionResult Terms()
{
    return View();
}

[HttpGet]
public IActionResult Index()
{
    NotificationHelper.AddErrorNotification("error!", TempData);
    return RedirectToAction("Terms");
}
Run Code Online (Sandbox Code Playgroud)

问题是为了使用数据,我在视图中转换类型,如下所示:

var errorMessages = TempData["errorNotification"] as List<string>;

转换后我必须这样做:

var errorMessages = TempData["errorNotification"] as string[];

由于预期类型错误(取决于我是否尝试在重定向之前或之后呈现视图),上述转换之一将返回为 null。这是 TempData 的理想行为吗?我如何确保视图可以期望提供一种特定类型?

m3h*_*h0w 6

IEnumerable正如@Stephen Muecke 所建议的那样,我最终选择了使用,因为我只是在寻找迭代数据而不是扩展或更改它。

因此,在视图中,我没有尝试猜测它是列表还是数组,而是IEnumerable将两者都考虑在内:

var errorMessages = TempData["errorNotification"] as IEnumerable<string>;
Run Code Online (Sandbox Code Playgroud)