ModelState已清除,但仍显示数据

时间:2017-01-05 23:52:10

标签: c# asp.net-mvc

当用户登录时,通常要做的就是不给密码。我在MVC 5中尝试这个,并且无法实现。我尝试了model.PASSWORD = ""以及ModelState.Clear(),但数据仍在显示。

控制器:

public async Task<ActionResult> Login(Login model) {
    if(ModelState.IsValid) {
        User temp = await db.Users.Where(u => u.USERNAME == model.USERNAME).FirstOrDefaultAsync();
        if(temp != null) {
            try {
                if(Password.VerifyPass(model.PASSWORD, temp.PASSWORD)) {
                    LoginUser(temp);
                    return RedirectToAction("Index", "EMR");
                }
            } catch { }
        }
    }
    ModelState.Clear();
    model.PASSWORD = "";
    ModelState.AddModelError("", "Username/password is unknown, or model was invalid!");
    return View();
}

型号:

public class Login {

        [Display(Name = "Username")]
        public string USERNAME { get; set; }

        [Display(Name = "Password")]
        public string PASSWORD { get; set; }
    }
}

查看:

@using(Html.BeginForm()) {
    @Html.AntiForgeryToken()
    <div class="form-horizontal">
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
        <div class="form-group">
            @Html.LabelFor(model => model.USERNAME, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.USERNAME, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.USERNAME, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.PASSWORD, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.PASSWORD, new { htmlAttributes = new { @class = "form-control", @type = "password" } })
                @Html.ValidationMessageFor(model => model.PASSWORD, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Login" class="btn btn-success" />
            </div>
        </div>
    </div>
}

在VisualStudio调试模式下查看ModelState变量和模型变量时,它们同时将数据显示为""。可能导致这种情况的原因是什么?

5 个答案:

答案 0 :(得分:1)

清除后,您不会将模型传回视图

return View(model);

仍然无效,请尝试以下操作。

var newModel = new Login { Password = "" };
ModelState.Clear();
return View(newModel); 

答案 1 :(得分:1)

我认为这是由于浏览器兑现,使用

注释登录操作
[OutputCacheAttribute(VaryByParam = "*", Duration = 0, NoStore = true)]

除了

return View(model);

答案 2 :(得分:1)

正如我所评论的,一种可能的解决方案是简单地使用@ Html.PasswordFor()。这将为密码输入呈现语义正确的输入,隐式提示浏览器不自动填充。所以,而不是@Html.EditorFor,试试这个:

@Html.PasswordFor(model => model.PASSWORD, new { htmlAttributes = new { @class = "form-control" })

答案 3 :(得分:1)

首先使用Password数据类型装饰您的密码字段。

public class Login 
{    
        [Display(Name = "Username")]
        public string USERNAME { get; set; }

        [Display(Name = "Password")]
        [DataType(DataType.Password)]
        public string PASSWORD { get; set; }        
}

在视图中,使用PasswordFor辅助方法。

@Html.PasswordFor(x=>x.PASSWORD)

使用此功能,您无需将密码字段显式设置为空字符串。 MVC将为您做到这一点。

答案 4 :(得分:0)

@CalebHuggins看起来它是浏览器记住输入字段值并填充它们。您可以尝试将文本框的自动填充属性设置为&#34; off&#34;为了避免这种情况。

您的模型绑定文本框可能如下所示。

@Html.TextBoxFor(x => x.Something, new { autocomplete="off" } )

Thnaks和问候, Chetan Ranpariya