ASP.NET MVC 3 CheckboxFor сохраняет предыдущее значение, несмотря на значение модели - PullRequest
0 голосов
/ 11 октября 2011

Я пытаюсь добавить классический флажок Принять условия и положения на странице входа в приложение 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 за то, что он не был более понятным.

1 Ответ

3 голосов
/ 11 октября 2011

Вам необходимо очистить ModelState для AcceptTermsAndConditions.По своей структуре CheckBoxFor и другие помощники, связанные с данными, привязываются сначала к ModelState, а затем к модели, если для элемента нет ModelState.Добавьте следующее к вашему действию POST:

ModelState.Remove("AcceptTermsAndConditions");
...