我知道有几种解决方案,但我一直在寻找纯 C# 解决方案。我最喜欢@TylerLong 的解决方案,尽管我想支持每种类型的多条消息。另外,这是针对 ASP.NET MVC4 更新的,由于不需要更改配置文件,它可能也适用于其他版本的 MVC 框架。
特点
- 纯 C# 解决方案
- 使用 View Helpers、Partials 和 Controller 类的扩展方法
- 应该与 MVC 框架的多个版本兼容
- 每种类型支持多条消息
- 您的 Web.config 文件没有配置更改
1) 创建MvcProject/Helpers/FlashHelper.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace MvcProject.Helpers
{
public enum FlashLevel
{
Info = 1,
Success = 2,
Warning = 3,
Danger = 4
}
public static class FlashHelper
{
public static void Flash(this Controller controller, string message, FlashLevel level)
{
IList<string> messages = null;
string key = String.Format("flash-{0}", level.ToString().ToLower());
messages = (controller.TempData.ContainsKey(key))
? (IList<string>)controller.TempData[key]
: new List<string>();
messages.Add(message);
controller.TempData[key] = messages;
}
}
}
2) 将MvcProject/Views/Shared/_Flash.cshtml 创建为部分:
@helper FlashMessage(System.Web.Mvc.TempDataDictionary tempData)
{
<div class="flash-messages">
@foreach (FlashLevel level in (FlashLevel[]) Enum.GetValues(typeof(FlashLevel)))
{
string type = level.ToString().ToLower();
string key = "flash-" + type;
if (tempData.ContainsKey(key))
{
IList<string> messages = (IList<string>)tempData[key];
foreach (string message in messages)
{
<p class="alert alert-@type" role="alert">@message</p>
}
}
}
</div>
}
@FlashMessage(TempData)
3) 在MvcProject/Views/Shared/_Layout.cshtml 中渲染_Flash 部分
@Html.Partial("_Flash")
这将导致网页中包含 Flash 消息。
4) 在控制器中添加 Flash 消息
最后一块拼图在你的控制器中,它现在应该有一个名为Flash(string message, FlashLevel level)的方法:
using MvcProject.Helpers;
public class FoosController : Controller
{
public ActionResult Edit(int id, FooViewModel model)
{
// ...
this.Flash("Foo was updated", FlashLevel.Success);
this.Flash("Another success message!", FlashLevel.Success);
this.Flash("But there was a slight problem...", FlashLevel.Warning);
return RedirectToAction("Edit", new { id = id });
}
}