MVC - 显示来自控制器的消息

时间:2016-11-17 16:23:41

标签: asp.net-mvc toastr

在我的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>
    }
}
&#13;
&#13;
&#13;

2)部分视图添加到主页面(_Message.cshtml):

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

3)在母版页中,我添加了与部分消息视图相关的div:

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

4)在控制器内部,我有一个通过TempData添加消息的方法:

&#13;
&#13;
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;

}
&#13;
&#13;
&#13;

当请求通过POST并且再次加载主页面(_Layout.cshtml)时,消息查看正确发生。 问题是当通过ajax进行调用并且仅加载部分视图或者没有返回任何项目时。在这些条件下,如果是局部视图&#34; _Message.cshtml&#34;未重新加载,不显示消息。

另一个问题是我的标准错误处理也使用此函数来显示消息。这样,当ajax调用发生错误时,只有在用户重新加载整个页面时才会显示该消息。

我正在使用的姑息解决方案是,在每次ajax调用结束时,对服务器进行新的调用,强制重新加载消息div,如下所示:

&#13;
&#13;
$(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");
}
&#13;
&#13;
&#13;

我对所提供的解决方案不太满意,因为我不必要地强行对服务器进行新的调用。

我想与您分享此问题,以找到解决此问题的最佳方法。

0 个答案:

没有答案