【发布时间】:2014-08-05 05:59:24
【问题描述】:
我在使用 MVC5 Razor Web 应用程序时遇到问题。我有一个身份验证页面 (cshtml),其中包含一个 ID 和密码助手控件:
@model NetInfinity.Middleware.VistaModelos.LoginVistaModelo
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<h1>@Login.Acceso</h1>
<p>
@Html.TextBoxFor(c => c.Id, new { @placeholder = @Login.Usuario, autofocus = "", autocomplete = "off", maxlength = "15", size = "15" })
</p>
<p class="p1">
@Html.PasswordFor(c => c.Clave, new { @placeholder = @Login.Contraseña, maxlength = "20", size = "20" })
@Html.ActionLink(".", "Cambiopwd", null, new { @class = "login-cambiarpwd", id = "Cambiopwd" })
</p>
<p class="login-recordarpwd">@Html.ActionLink(@Login.RecordarPwd, "Recordatoriopwd")</p>
<button type="button" class="login-submit" id="login-submit">@Login.LoginSubmit</button>
}
以及各自的模型:
public class LoginVistaModelo
{
public string Id
{
get;
set;
}
[DataType(DataType.Password)]
public string Clave
{
get;
set;
}
public string MensajeError
{
get;
set;
}
}
验证用户的控制器动作是:
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginVistaModelo vmUsuario)
{
if (ModelState.IsValid)
{
EntidadesBD backend;
var cache = MemoryCache.Default;
backend = (EntidadesBD)cache.Get("backend");
if (backend == null)
{
backend = new EntidadesBD();
var politica = new CacheItemPolicy { Priority = CacheItemPriority.NotRemovable };
cache.Set("backend", backend, politica);
}
Usuario usuario = vmUsuario.ValidaUsuario();
if (usuario == null)
{
vmUsuario.MensajeError = "error2";
vmUsuario.Id = vmUsuario.Clave = String.Empty; // <--- This not works
ModelState.Clear(); // <-- This not works
}
else
{
}
}
return View(vmUsuario);
}
当触发登录操作以验证用户和密码并引发错误时,我需要清除 TextBoxFor 值和 PasswordFor 值,为此我在 Controller 中将模型属性 Id 和 Clave 设置为 string.empty,但是当页面 ( cshtml) 再次呈现,控件保留旧值忽略模型更改,即使 ModelState.Clear() 也不会。我听说 HtmlHelpers 控件(如 .TextBoxFor() 等)不会绑定到 Postback 上的模型值,而是直接从 ModelState 的 POST 缓冲区中获取它们的值。请 ¿ 在模型属性中更改控件值时如何更新控件值?
谢谢
【问题讨论】:
-
我不清楚您要做什么。为什么要在出现错误时清除值?保留这些值会提高可用性,这样用户就可以看到他们犯了什么错误。否则他们可能会继续犯同样的错误。
-
因为我想强制用户再次提供用户名和密码
-
可用性太差了。特别是当您考虑使用电话等触摸设备的用户时。通过将多个键盘转换为各种数字和字符来输入用户名可能需要相当大的努力。我绝对讨厌这样的网站。
-
解决方案是面向 Intranet 的,而不是设备或电话使用。
标签: asp.net-mvc asp.net-mvc-4 razor