ModelState очищается, но данные все еще показывают

101
10

Когда пользователь входит в систему, нормальная вещь - НЕ давать пароль обратно. Я пытаюсь это сделать в 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>
}

Посмотрев на переменную ModelState и переменную модели в режиме отладки VisualStudio, они ОБОИХ показывают данные как "". Что может быть причиной этого?

спросил(а) 2017-01-06T02:52:00+03:00 3 года, 11 месяцев назад
1
Решение
59

Как я уже сказал, одним из возможных решений является просто использовать @Html.PasswordFor(). Это сделает ввод, который семантически корректен для ввода пароля, что неявно намекает на то, что браузер не будет автозаполнять. Итак, вместо @Html.EditorFor, попробуйте следующее:

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

ответил(а) 2017-01-06T19:01:00+03:00 3 года, 11 месяцев назад
59

Сначала украсьте свое поле пароля Password типа Datatype.

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 сделает это за вас.

ответил(а) 2017-01-06T19:23:00+03:00 3 года, 11 месяцев назад
58

я думаю, что это связано с обналичиванием браузера, аннотацией действия входа с

[OutputCacheAttribute(VaryByParam = "*", Duration = 0, NoStore = true)]

в дополнении к

return View(model);

ответил(а) 2017-01-06T17:59:00+03:00 3 года, 11 месяцев назад
59

Вы не передали модель обратно, чтобы ее просмотреть.

return View(model);

Все еще не работает, как показано ниже.

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

ответил(а) 2017-01-06T07:20:00+03:00 3 года, 11 месяцев назад
42

@CalebHuggins похоже, что это браузер, который запоминает значения полей ввода и заполняет их. Вы можете попробовать установить атрибут автозаполнения ваших текстовых полей на "выключено", чтобы этого избежать.

Текстовое поле с привязкой к модели может выглядеть следующим образом.

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

Тнакс и привет, Четан Ранпария

ответил(а) 2017-01-06T18:13:00+03:00 3 года, 11 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема