在RedirectToAction()

时间:2017-07-25 14:19:30

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

我正在使用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的理想行为吗?如何确保视图可以提供一种特定类型?

2 个答案:

答案 0 :(得分:2)

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

因此,在视图中,我没有尝试猜测它是列表还是数组,而是使用IEnumerable来解释这两个问题:

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

答案 1 :(得分:1)

如果要保留类型,则在将字符串列表分配给TempData之前序列化它,然后在检索时对其进行反序列化。这就是我最终做的事情。虽然在我的情况下,我最终存储了NotifyEntry的列表,而不是string的列表。

public class NotifyEntry
{
    public NotifyType Type { get; set; }
    public string Text { get; set; }
}

public enum NotifyType
{
    Success,
    Information,
    Warning,
    Error
}