Как сохранить состояние Html.CheckBox () в ASP.NET MVC - PullRequest
4 голосов
/ 08 февраля 2009

У меня есть два флажка в моем приложении MVC, которые оба являются логическими / битовыми полями. «NotifyEmail» и «NotifySMS».

Всякий раз, когда я отправляю сообщение обратно на сервер, и возникает ошибка, состояние флажка исчезает, хотя я установил значения попытки.

Ответы [ 8 ]

7 голосов
/ 01 мая 2009

Почему бы не что-нибудь простое?

<%=Html.CheckBox("AgreeToRules", (Request.Form["AgreeToRules"] ?? string.Empty).Contains("true"))%>
3 голосов
/ 22 февраля 2009

Обновление: Это исправлено в RC2.

Этот вопрос вместе с этим,

Html.Checkbox не сохраняет свои состояние в ASP.net MVC ,

обращается к очень недокументированной функции ASPNET.MVC RC1. Я часами искал, чтобы найти хороший ответ, но найти очень мало.

По-видимому, есть ошибка , которая запрещает флажкам и радиокнопкам сохранять свое состояние в ModelState. К настоящему времени мы также знаем, что эти два элемента управления обрабатываются специально помощниками Html.

Лучшее, что мне удалось придумать, - это создать собственный ViewBinder:

Из очень простого вида:

<h2>Keep checkbox value between posts</h2>

<% using (Html.BeginForm("update", "checkbox")) {%>

<p><%= Html.CheckBox("a") %></p>
<p><%= Html.CheckBox("b") %></p>
<p><%= Html.TextBox("dummy") %></p>

<input type="submit" value="update" />

<% } %>

Связан с таким же простым контроллером:

public class CheckboxController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    public ActionResult Update()
    {
        var binder = new ViewBinder(ViewData, ValueProvider);
        binder.UpdateBooleanValues("a", "b");
        binder.UpdateMissingValues();

        return View("Index");
    }
}

И простой класс, чтобы заставить все это работать:

internal class ViewBinder
{
    private readonly IDictionary<string, ValueProviderResult> valueProvider;
    private readonly ViewDataDictionary viewData;

    public ViewBinder(ViewDataDictionary viewData, IDictionary<string, ValueProviderResult> valueProvider)
    {
        this.valueProvider = valueProvider;
        this.viewData = viewData;
    }

    public void UpdateMissingValues()
    {
        foreach (var key in valueProvider.Keys)
        {
            if (ValueIsMissing(key)) UpdateValue(key);
        }
    }

    public void UpdateBooleanValues(params string[] names)
    {
        foreach (var name in names)
        {
            UpdateValue(name, BooleanValueFor(name));
        }
    }

    private bool BooleanValueFor(string name)
    {
        return valueProvider[name].AttemptedValue != "false";
    }

    private bool ValueIsMissing(string key)
    {
        return viewData.ContainsKey(key) == false;
    }

    private void UpdateValue(string key)
    {
        var value = valueProvider[key].AttemptedValue;
        UpdateValue(key, value);
    }

    private void UpdateValue(string key, object value)
    {
        viewData[key] = value;
    }
}
2 голосов
/ 08 февраля 2009

MVC не имеет ViewState, как WebForms - это означает, что теперь вы несете ответственность за поддержание этих значений.

Для этого потребуется сохранить, установлен ли флажок или нет, и затем снова применить этот параметр к флажку, прежде чем страница будет отображена в браузере в вашем представлении.

0 голосов
/ 21 июля 2010
0 голосов
/ 12 июня 2009

Андрей Ринея частично прав. Но я сделал - это использовал помощники и передал обратно на страницу предыдущие значения в DataClass (доступный через Model и т. Д.). Это работает хорошо.

0 голосов
/ 21 февраля 2009

Использование HTML-помощника, такого как Html.CheckBox, автоматически сохраняет состояние при POST.

0 голосов
/ 09 февраля 2009

Как вы указываете свой флажок HTML? Привязка потребует скрытого элемента ввода в дополнение к элементу ввода флажка. Html.Checkbox справится с этим за вас, или вы можете изучить, как он это делает, и сделать это самостоятельно.

0 голосов
/ 08 февраля 2009

Адам

Предполагая, что вы понимаете, что MVC не включает в себя функциональность сервера для обработки постбэков Asp.Net, если вам нужно отправить обратно на сервер сообщение, информирующее ваше приложение о том, что флажок установлен, то, вероятно, лучше сделать это с Javascript и запросом Ajax. .Net MVC включает в себя библиотеку JQuery Javascript, поэтому сделать это может быть проще, чем вы думаете. Вот ТАКОЙ пост, который описывает, как правильно использовать флажки в MVC.

В противном случае, следует понимать, что MVC не поддерживает постбэк, и, как Эндрю сказал выше, также не поддерживает состояние просмотра Asp.Net. Тем не менее, вы можете вернуться к старому школьному способу просмотра состояния и использовать обычный скрытый элемент ввода HTML с небольшим количеством javascript для поддержания вашего состояния.

При всем этом, вы можете потратить минуту, чтобы прочитать эту статью . Многие платформы MVC предполагают, что вы будете использовать шаблон Post -> Redirect -> Get для обработки пользовательского ввода в ваших веб-формах. Если вы продолжите использовать свой текущий шаблон постбэк и состояния просмотра, в будущем вы можете столкнуться с большим количеством проблем, подобных той, которую вы сейчас пытаетесь решить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...