【发布时间】:2017-12-31 13:01:08
【问题描述】:
我正在使用 TempData 允许在重定向后显示错误消息。为了兼容性,我使用List<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;
}
在控制器内部,我用错误消息填充 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");
}
问题是,为了使用数据,我在视图中转换类型,如下所示:
var errorMessages = TempData["errorNotification"] as List<string>;
在转换之后我必须这样做:
var errorMessages = TempData["errorNotification"] as string[];
由于预期类型错误(取决于我是否尝试在重定向之前或之后渲染视图),上述转换之一将返回为 null。这是 TempData 的理想行为吗?如何确保视图可以预期提供一种特定类型?
【问题讨论】:
-
你总是可以使用
var errorMessages = TempData["errorNotification"] as IEnumerable<string>;,但你真的不应该在视图中使用该代码(你应该将它分配给控制器中的视图模型属性(或ViewBag属性)方法 -
@StephenMuecke 感谢您的意见。我假设您的意思是返回视图的方法,因为据我了解 - 这就是 ViewBag 的工作方式。这个通知背后的想法是不管重定向如何都会显示它,所以当我使用 AddErrorNotification 方法时,我不需要知道哪个视图将显示它。
标签: c# asp.net-core asp.net-core-mvc