在我的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;
2)部分视图添加到主页面(_Message.cshtml):
@if (TempData.ContainsKey("Alerta"))
{
Alerta alerta = TempData["Alerta"] as Alerta;
@MensagemAlerta.MostrarMensagensAlerta(alerta);
}
&#13;
3)在母版页中,我添加了与部分消息视图相关的div:
<div id="div-mensagens">
@Html.Partial("_Mensagem")
</div>
&#13;
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;
}
&#13;
当请求通过POST并且再次加载主页面(_Layout.cshtml)时,消息查看正确发生。 问题是当通过ajax进行调用并且仅加载部分视图或者没有返回任何项目时。在这些条件下,如果是局部视图&#34; _Message.cshtml&#34;未重新加载,不显示消息。
另一个问题是我的标准错误处理也使用此函数来显示消息。这样,当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");
}
&#13;
我对所提供的解决方案不太满意,因为我不必要地强行对服务器进行新的调用。
我想与您分享此问题,以找到解决此问题的最佳方法。