ASP.NET MVC 注销和返回按钮
Posted
技术标签:
【中文标题】ASP.NET MVC 注销和返回按钮【英文标题】:ASP.NET MVC logout and back button 【发布时间】:2020-11-21 12:38:09 【问题描述】:我有一个用 C# 编写的 ASP.NET MVC 应用程序,其中用户 login
。然后出现一个屏幕,您可以在其中看到您的东西并有注销按钮 (cerrar sesión)。登录和注销按钮有效,但问题在于后退按钮,当我按下它时,您会看到以下内容:
然后我按F5:
当按下继续时,登录的用户页面将重新加载:
换句话说,当您返回时,您会看到要再次发送表单的空白页面,当您按继续时,用户的视图会再次显示。有没有办法避免它?目前我的代码在controller
:
public ActionResult Index()
Response.AppendHeader("Cache-Control", "no-store");
return View();
[OutputCache(NoStore = true, Duration = 0, Location = OutputCacheLocation.None)]
public ActionResult Login(string uname, string psw)
Response.AppendHeader("Cache-Control", "no-store");
try
ConexionSQL sql = new ConexionSQL();
var caracteres = Convert.ToString(psw);
var usuario = sql.login(uname, psw);
if (caracteres == "" || caracteres == null || caracteres.Equals(""))
ViewBag.Alert = "Ingrese contraseña.";
if (usuario.Count <= 0)
ViewBag.MensajeUsuario = "El usuario es inexistente.";
else if (usuario[0].nivel == 0
|| usuario[0].nivel == 1
|| usuario[0].nivel == 2
|| usuario[0].nivel == 7)
return View("Login1", usuario);
else if (usuario[0].nivel == 3
|| usuario[0].nivel == 4
|| usuario[0].nivel == 16)
return View("Login2");
else
return View("Index");
catch (SqlException ex)
throw ex;
return View("");
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult LogOff()
Response.AppendHeader("Cache-Control", "no-store");
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetExpires(DateTime.Now.AddSeconds(-1));
Response.Cache.SetNoStore();
Session.Clear();
FormsAuthentication.SignOut();
//return View("Index");
return RedirectToAction("Index", "Home");
这是logout button (cerrar sesión)
所在视图的代码:
@model IEnumerable<ProvidusHomeWeb.Models.Usuarios>
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<meta charset="utf-8">
<title>Providus</title>
</head>
<body>
@* Navigation Bar *@
<div class="topnav">
<a href="javascript:ruta()">Home</a>
@using (Html.BeginForm("LogOff", "Home", FormMethod.Post, new role = "form" ))
@Html.AntiForgeryToken()
<button onclick="document.getElementById('id01').style.display='block'" style="width:auto;">Cerrar sesión</button>
@foreach (var item in Model)
<label>Bienvenida/o: @Html.DisplayFor(modelitem => item.usuario)</label>
</div>
</body>
</html>
这是login
表单所在的索引视图:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width" />
<title>Providus</title>
</head>
<body>
@* Navigation Bar *@
<div class="topnav">
<a href="javascript:ruta()">Home</a>
<div class="login-container">
<button onclick="document.getElementById('id01').style.display='block'" style="width:auto;">Login</button>
</div>
</div>
<div id="id01" class="modal">
<form class="modal-content animate" onsubmit="return control()" method="post" action="@Url.Action("Login", "Home")">
<div class="imgcontainer">
<span onclick="document.getElementById('id01').style.display='none'" class="close" title="Close Modal">×</span>
<img src="~/Images/00.png" class="avatar">
</div>
<div class="container">
<label for="uname"><b>Usuario:</b></label>
<input type="text" id="uname" placeholder="Ingrese usuario..." name="uname" onkeypress="return soloLetras(event)">
<label for="psw"><b>Contraseña:</b></label>
<input type="password" placeholder="Ingrese contraseña..." id="psw" name="psw" onkeypress="return soloNumeros(event)">
<button type="submit">Iniciar sesión</button>
</div>
</form>
</div>
<center><img class="img" src="~/Images/00.png" /></center>
<center><p>Bienvenida/o, por favor inicie sesión.</p></center>
<script>
function control()
if (document.getElementById('uname').value == null
|| document.getElementById('uname').value == "")
alert("El campo no puede estar vacío.");
document.getElementById('uname').focus();
return false;
else if (document.getElementById('psw').value == null || document.getElementById('psw').value == "")
alert("El campo no puede estar vacío.");
document.getElementById('psw').focus();
return false;
return true;
</script>
<center>
<p>@ViewBag.Usu</p>
<p>@ViewBag.Contra</p>
</center>
</body>
</html>
Global.asax:
protected void Application_Start()
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
protected void Application_BeginRequest()
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetExpires(DateTime.UtcNow.AddHours(-1));
Response.Cache.SetNoStore();
【问题讨论】:
【参考方案1】:在 Global.asax.cs 文件中添加以下函数。
protected void Application_BeginRequest()
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetExpires(DateTime.UtcNow.AddHours(-1));
Response.Cache.SetNoStore();
【讨论】:
表单/帖子缓存独立于页面缓存,不幸的是,在大多数浏览器中。 认为您需要找到一种方法使该表单/帖子页面远离浏览器历史记录。一种方法是立即从接受帖子的页面重定向。另一种方法是使用脚本刷新页面。这是related answer以上是关于ASP.NET MVC 注销和返回按钮的主要内容,如果未能解决你的问题,请参考以下文章
如何在 asp.net 应用程序中注销按钮 Windows 身份验证
C# & ASP.NET MVC 5 - 从按钮单击执行存储过程,没有返回值
Asp.net MVC 5 视图在使用 F5 重新加载页面之前不呈现
点击浏览器后退按钮时如何刷新 ASP .NET MVC 页面