Я пытаюсь добавить классический флажок Принять условия и положения на странице входа в приложение MVC.
Если пользователь принимает Условия и положения, но не может войти в систему по какой-либо другой причине(неверный пароль и т. д.), тогда я хочу, чтобы флажок «Принять условия и условия» не устанавливался, поэтому пользователь вынужден принимать условия и положения при каждой попытке входа в систему.
Проблема заключается в том, что при использовании Html.CheckboxFor (),после обратной передачи флажок сохраняет свое предыдущее значение, несмотря на значение привязанного свойства Model.
Вот код, размеченный до самого необходимого.Если вы запустите этот код, установите флажок и нажмите кнопку, вы вернетесь в форму с установленным флажком, хотя свойство связанной модели имеет значение false.
Модель:
namespace Namespace.Web.ViewModels.Account
{
public class LogOnInputViewModel
{
[IsTrue("You must agree to the Terms and Conditions.")]
public bool AcceptTermsAndConditions { get; set; }
}
}
Атрибут проверки:
public class IsTrueAttribute : ValidationAttribute
{
public IsTrueAttribute(string errorMessage) : base(errorMessage)
{
}
public override bool IsValid(object value)
{
if (value == null) return false;
if (value.GetType() != typeof(bool)) throw new InvalidOperationException("can only be used on boolean properties.");
return (bool)value;
}
}
Вид:
@model Namespace.Web.ViewModels.Account.LogOnInputViewModel
@using (Html.BeginForm()) {
@Html.CheckBoxFor(x => x.AcceptTermsAndConditions)
<input type="submit" value="Log On" />
}
Контроллер:
[HttpGet]
public ActionResult LogOn(string returnUrl)
{
return View(new LogOnInputViewModel { AcceptTermsAndConditions = false });
}
[HttpPost]
public ActionResult LogOn(LogOnInputViewModel input)
{
return View(new LogOnInputViewModel { AcceptTermsAndConditions = false });
}
Я видел предложение на asp.net чтобы добавить атрибут @ checked
в CheckboxFor.Я попробовал это, сделав представление
@model Namespace.Web.ViewModels.Account.LogOnInputViewModel
@using (Html.BeginForm()) {
@Html.CheckBoxFor(x => x.AcceptTermsAndConditions, new { @checked = Model.AcceptTermsAndConditions })
<input type="submit" value="Log On" />
}
И я увидел такое же поведение.
Спасибо за любую помощь / понимание!
Редактировать :Хотя я хочу переопределить опубликованное обратное значение, я хочу сохранить сообщение, если проверка AcceptTermsAndConditions не удалась (для AcceptTermsAndConditions существует атрибут проверки, требующий, чтобы оно было истинным), поэтому я не могу использовать ModelState.Remove("AcceptTermsAndConditions")
, который был бы другим звукомответ @counsellorben дал мне.Я отредактировал приведенный выше код, добавив в него атрибут validation - извиняюсь перед @counsellorben за то, что он не был более понятным.