Это можно сделать несколькими способами. Для небольшого проекта, который я работаю над простым механизмом, будет достаточно, и я использую TempData. У меня есть метод расширения stati c для класса контроллера. Я просто добавляю сообщение и отображаю в действии, которое затем отображается в макете, используемом всеми представлениями
/// <summary>
/// Add a message to a list of messages in Tempdata
/// </summary>
/// <param name="c"></param>
/// <param name="message"></param>
public static void AddTempDataMessage(this Controller c, string message)
{
// assume a new list
var messages = new List<string>();
// check if object already exists
object m = c.TempData.Peek("Messages");
// object stored as a string array for simplicity
if (m != null && m is string[] v)
{
// set existing array to the list
messages = v.ToList();
}
messages.Add(message);
// Store as a simple array since using a List<string> changes to string[] on redirect (Microsoft bug?)
c.TempData["Messages"] = messages.ToArray();
}
Пример использования действия
if (imageExists != null)
{
this.AddTempDataMessage("Image already in set");
return RedirectToAction("EditImageSet", new { imageSetId });
}
Использование в общем представлении макета
// A list of messages to display
List<string> Messages()
{
// assume a new list
var messages = new List<string>();
// check if already exists
object m = TempData["Messages"];
// stored as an array of strings since a redirect changes a list to an array so we stored it as an array
if (m != null && m is string[])
{
// set existing
messages = ((string[])m).ToList();
}
return messages;
}
@* Messages *@
<div class="text-danger">
@foreach (var m in Messages())
{
<span class="mr-2">@(m + ".")</span>
}
</div>