我知道这有点老了,但是......
我过去所做的是将“MessageArea”类公开为我的基本控制器上的一个属性,我的所有控制器最终都继承自该属性。该属性实际上将类实例存储在 TempData 中。 MessageArea 有一个 Add() 方法,该方法接受字符串消息和枚举类型(例如成功、错误、警告、信息)。
然后我有一个部分,它根据消息的类型以适当的样式呈现 MessageArea 中的任何消息。
我有一个 HTMLHelper 扩展方法 RenderMessageArea(),所以在任何视图中我都可以简单地说 @Html.RenderMessageArea(),该方法和部分处理空值,如果没有消息,则不会输出任何内容。
因为存储在 TempData 中的数据只能在 1 个请求中存活,所以它非常适合您希望操作重定向但在目标页面上显示 1 个或多个消息的情况,例如错误,未授权页面等...或者如果您添加项目但随后返回索引列表页面。
显然,您可以实现类似的东西来传递其他数据。最终,我会说这是对原始问题的更好解决方案,而不是接受的答案。
编辑,示例:
public class MessageAreaModel {
public MessageAreaModel() {
Messages = new List<Message>();
}
public List<Message> Messages { get; private set; }
public static void AddMessage(string text, MessageIcon icon, TempDatadictionary tempData) {
AddMessage(new Message(icon, text), tempData);
}
public static void AddMessage(Message message, TempDataDictionary tempData) {
var msgArea = GetAreaModelOrNew(tempData);
msgArea.Messages.Add(message);
tempData[TempDataKey] = msgArea;
}
private static MessageAreaModel GetAreaModelOrNew(TempDataDictionary tempData) {
return tempData[TempDataKey] as MessageAreaModel ?? new MessageAreaModel();
}
然后可以使用上面的类从控制器使用的 UI 层添加消息。
然后像这样添加一个 HtmlHelper 扩展:
public static void RenderMessageArea(this HtmlHelper html) {
html.RenderPartial("MessageArea",
(MessageAreaModel)html.ViewContext.TempData[MessageAreaModel.TempDataKey] ?? MessageAreaModel.Empty);
html.ViewContext.TempData.Remove(MessageAreaModel.TempDataKey);
}
上面的代码还没有完全完成,我遗漏了各种花里胡哨的东西,但你得到了印象。