Ich verwende Alertify.js, um Bestätigungsmeldungen usw. in meinen Ansichten anzuzeigen. Ich habe gekämpft, um eine gute Möglichkeit zu finden, die Nachricht vom Controller zur Ansicht zu übergeben.Übergeben von Nachrichten an die Ansicht
Ich habe ein Janky-Gefühl-Setup mit TempData, das funktioniert, aber nur, wenn ich eine Ansicht zurückgebe, anstatt eine Weiterleitung, die ziemlich nutzlos ist.
Ich wollte diese Funktion zunächst zu einem Basis-Viewmodel hinzufügen, aber RedirectToAction
unterstützt keine Übergabe von Viewmodels.
Ich muss entweder die TempData länger herumliegen lassen oder einen anderen Prozess verwenden.
Was ich jetzt:
public class AlertifyMessages
{
public List<AlertifyMessage> Messages { get; private set; } = new List<AlertifyMessage>();
public void Add(AlertifyType type, string message, string callbackUrl = null)
{
Messages.Add(new AlertifyMessage(type, message, callbackUrl));
}
}
public class AlertifyMessage
{
public AlertifyType Type { get; set; }
public string Message { get; set; }
public string CallbackUrl { get; set; }
public AlertifyMessage(AlertifyType type, string message, string callbackUrl)
{
Type = type;
Message = message;
CallbackUrl = callbackUrl;
}
}
public enum AlertifyType
{
Log,
Error,
Success
}
/// <summary>
/// Applies Alertify messages to TempData after action method runs
/// <para>Can only be used with <see cref="BaseController"/></para>
/// </summary>
public class AlertifyAttribute : ActionFilterAttribute
{
public override void OnResultExecuting(ResultExecutingContext context)
{
BaseController bc = (BaseController)context.Controller;
bc.TempData["Alertify"] = bc.AlertifyMessages;
}
}
[Alertify]
public class BaseController : Controller
{
public BaseController()
{
AlertifyMessages = new AlertifyMessages();
}
public AlertifyMessages AlertifyMessages { get; set; }
}
Verbrauch:
public class MyController : BaseController
{
public ActionResult Index()
{
AlertifyMessages.Add(AlertifyType.Success, "Yay!", Url.Action("Index"));
return View(/*new ViewModel()*/);
}
}
// Then loop through and display messages in view using TempData
bearbeiten
Die akzeptierte Antwort ist richtig, aber Tonnen von Refactoring zu vermeiden, habe ich nur noch einen anderen Filter meine Attribut, unten:
private const string alertify = "Alertify";
public override void OnActionExecuting(ActionExecutingContext context)
{
BaseController bc = (BaseController)context.Controller;
bc.Messages = (bc.TempData[alertify] == null) ? new AlertifyMessages() : (AlertifyMessages)bc.TempData[alertify];
// Faster? Better? Harder? Stronger?
//bc.Messages = (AlertifyMessages)bc.TempData[alertify] ?? new AlertifyMessages();
}
TempData sollte Redirect funktionieren. Warum glaubst du, dass es nicht funktioniert? Können Sie den Code teilen, der isssue ist? – Shyju
@Shyju Es funktioniert, wenn ich eine Ansicht zurückgebe, und nicht, wenn ich eine Weiterleitung zurückgebe. Ich denke, das Attribut weist diesen tempdata-Eintrag neu zu, wodurch der vorhandene Eintrag verloren geht, bevor er einer Ansicht übergeben wird. Ich weiß einfach nicht, wie ich das sonst tun soll. – Sinjai