MVC - отображать сообщения от контроллера

В моем приложении MVC есть несколько ситуаций, когда, в зависимости от бизнес-правил функции, некоторые сообщения должны отображаться пользователю.

В настоящее время мы используем библиотеку Jquery "Toastr" для отображения сообщений пользователю. Развитие заключается в следующем:

1) Настройка параметров сообщений (Alert Message.cshtml)

@helper MostrarMensagensAlerta(Alerta alerta)
{
    if (alerta != null)
    {
    <script>
        $(document).ready(function () {
            window.toastr.options.closeButton = '@alerta.MostrarBotaoFechar';
            window.toastr.options.newestOnTop = '@alerta.MostrarNoTopo';

            @foreach (Aperam.Biblioteca.Util.Base.Entidades.MensagemAlerta mensagem in alerta.MensagensAlerta)
            {
                string tipoAlerta = mensagem.TipoAlerta.ToString("F").ToLower();                
                @: var opcoes = { /* Adicione atributos específidos dos alertas Toastr aqui */ };

                @:opcoes.closeButton = true;
                @:opcoes.progressBar = true;
                @:opcoes.positionClass = "toast-top-right";

                if (mensagem.ManterAlerta)
                {
                    @:opcoes.timeOut = 0;
                    @:opcoes.extendedTimeout = 0;
                }
                else
                {
                    @:opcoes.timeOut = 10000;
                    @:opcoes.extendedTimeOut = 10000;
                }

                var texto = mensagem.Mensagem.Replace("\r\n", "<br /> ").Replace("\r", "<br /> ").Replace("\n", "<br /> ").Replace("'", "");
                @:window.toastr['@tipoAlerta']('@(new HtmlString(texto))', '@mensagem.Titulo', opcoes);
            }
        });
    </script>
    }
}

2) Частичное представление добавлено на главную страницу (_Message.cshtml):

@if (TempData.ContainsKey("Alerta"))
{
  Alerta alerta = TempData["Alerta"] as Alerta;
  @MensagemAlerta.MostrarMensagensAlerta(alerta);
}

3) На главной странице я добавил div, относящийся к частичному просмотру сообщений:

<div id="div-mensagens">
  @Html.Partial("_Mensagem")
</div>

4) Внутри контроллера у меня есть метод, который добавляет сообщения от TempData:

public MensagemAlerta AdicionarMensagemAlerta(string mensagem, TipoAlerta tipoAlerta = TipoAlerta.Info)
{
 string titulo = string.Empty;

 switch (tipoAlerta)
 {
  case TipoAlerta.Error:
   titulo = "Erro";
   break;
  case TipoAlerta.Info:
  case TipoAlerta.Success:
   titulo = "Informação";
   break;
  case TipoAlerta.Warning:
   titulo = "Alerta";
   break;
 }

 Alerta alerta = TempData["Alerta"] as Alerta;
 alerta = alerta ?? new Alerta();

 var mensagemAlerta = alerta.AdicionarMensagemAlerta(titulo, mensagem, tipoAlerta);
 TempData["Alerta"] = alerta;
 return mensagemAlerta;

}

Просмотр сообщений происходит правильно, когда запрос выполняется по POST и главная страница (_Layout.cshtml) загружается снова. Проблема в том, что когда звонки осуществляются через ajax, и загружается только частичное представление или элемент не возвращается. В этих условиях, если частичное представление "_Message.cshtml" не перезагружается, сообщения не отображаются.

Другая проблема заключается в том, что моя стандартная обработка ошибок также использует эту функцию для отображения сообщений. Таким образом, когда возникает ошибка при вызове AJAX, сообщение отображается только тогда, когда пользователь перезагружает всю страницу.

Паллиативное решение, которое я использую, заключается в том, чтобы в конце каждого вызова ajax сделать новый вызов серверу, принудительно перезагружая сообщение div, следующим образом:

$(document).ajaxComplete(function(event, xhr, options) {
        if(options.url.toString().split('/')[2] != 'Mensagens')
            exibirMensagens();
    });

 function exibirMensagens() {
        $("#div-mensagens").load('@Url.Action("Mensagens")');
 }



public ActionResult Mensagens()
{
    return PartialView("~/Views/Shared/_Mensagem.cshtml");
}

Я не очень доволен решением, которое было дано, так как я без необходимости форсирую новый вызов на сервер.

Я хотел бы поделиться этой проблемой с вами, чтобы найти лучший способ справиться с этой ситуацией.

0 ответов

Другие вопросы по тегам