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 的理想行为吗?我如何确保视图可以期望提供一种特定类型?
IEnumerable
正如@Stephen Muecke 所建议的那样,我最终选择了使用,因为我只是在寻找迭代数据而不是扩展或更改它。
因此,在视图中,我没有尝试猜测它是列表还是数组,而是IEnumerable
将两者都考虑在内:
var errorMessages = TempData["errorNotification"] as IEnumerable<string>;
Run Code Online (Sandbox Code Playgroud)