【问题标题】:ASP.NET MVC Postbacks and HtmlHelper Controls is not reflecting Model ChangesASP.NET MVC 回发和 HtmlHelper 控件未反映模型更改
【发布时间】: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


【解决方案1】:

在返回给视图之前尝试将模型的值设为空, 像 vmUsuario.id = null, vmUsuario.clave= null ;然后返回空模型查看

【讨论】:

    【解决方案2】:

    解决此类问题的更好方法是重定向用户,而不是返回视图。否则你会遇到问题,如果他们按 F5 会重新发布数据。因此,只需重定向用户,并使用 TempData 包含您的错误消息。在您的 Get 方法中,检查 TempData 是否包含错误消息,如果包含则显示它。

    【讨论】:

      猜你喜欢
      • 2022-07-26
      • 1970-01-01
      • 2015-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多