несоответствие флажка asp.net mvc - PullRequest
5 голосов
/ 01 июня 2009

Я использую флажок в форме ASP.NET MVC следующим образом:

<%=Html.CheckBox("AgreeToRules", Model.AgreeToRules)%>

Свойство acceptToRules в модели является логическим значением. Во время тестирования все это работало нормально. Однако теперь, когда мы начали работу с этим приложением, я вижу относительно небольшое, но значительное количество ошибок в следующих сообщениях:

System.Web.HttpUnhandledException: Исключение типа 'System.Web.HttpUnhandledException' был брошен. ---> System.InvalidOperationException: преобразование параметров из типа 'System.String' для ввода Ошибка System.Boolean. Увидеть внутренний Исключение для получения дополнительной информации. ---> System.FormatException: Y не является допустимое значение для логического значения. ---> System.FormatException: строка не была признан действительным логическим значением.

Похоже, это происходит, когда механизм просмотра пытается отобразить форму после публикации, а значение флажка, возвращаемого из ValueProvider, выглядит следующим образом:

Y, ложь

OR

N, ложь

HTML-код, отображаемый в исходной форме, выглядит следующим образом:

<input id="AgreeToRules" name="AgreeToRules" type="checkbox" value="true" />
<input name="AgreeToRules" type="hidden" value="false" />

Во время тестирования я ожидал (и показал), что опубликованное значение будет выглядеть так:

истина, ложь

если отмечено или

ложь

если не проверено. Так откуда же N и Y?

Я добавил пользовательский агент в список информации, возвращаемой из обработчика ошибок, и кажется (пока), что все ошибки происходят под Windows XP с FF 3.0.10, но это именно то, что я тестировал, и проблема не существовала во время тестирования.

Есть мысли?

Ответы [ 4 ]

2 голосов
/ 27 октября 2012

У нас была такая же проблема в проекте, над которым я работаю (MVC 2). Мы решили это, заменив помощника простым HTML-кодом:

До: <%= Html.CheckBox("Credit", false, new {@validate = "required"}) %>

После того, как:

<input type="checkbox" name="Credit" value="true" validate="required" />
<input type="hidden" name="Credit" value="false" />
1 голос
/ 02 июня 2009

Что ж, я нашел проблему и решил опубликовать ее здесь на случай, если другие столкнутся с ней. Некоторые заполнители форм обнаруживают поля с использованием названий, которые я использовал, и пытаются «заполнить их» автоматически, устанавливая значение, равное тому, которое пользователь ранее использовал для полей с одинаковыми именами. Начиная поздно вечером, я также получаю "UNSUBSCRIBED" и "SUBSCRIBED" в качестве значений для флажка с именем "OptIn".

Таким образом, заполнитель формы изменяет значение флажка на что-то, и пользователь устанавливает флажок, в результате чего неожиданное значение передается на сервер.

Буду признателен за любые мысли по поводу этого.

1 голос
/ 06 июня 2009

Сегодня я нашел решение для аналогичной проблемы, которое, возможно, можно было бы адаптировать к вашим конкретным потребностям. Он «выполнит свою работу» в отношении того, о чем вы просите, но, возможно, не самое подходящее решение.

Идея состоит в том, что вы пройдете по полям, размещенным в форме, и исправите "неработающие" значения флажков. Вы можете создать ValueProviderDictionary a.k.a. IDictionary , а затем передать его в свой метод UpdateModel.

public static IDictionary<string, ValueProviderResult> CreateScrubbedValueProvider(NameValueCollection postedForm, string[] checkboxFieldsToScrub)
{
    Dictionary<string, ValueProviderResult> dict = new Dictionary<string, ValueProviderResult>();
    foreach (string key in postedForm.AllKeys) {
        string[] values = postedForm.GetValues(key);
        if (checkboxFieldsToScrub.Contains(key)) {
            // Ensure we have a "true" value instead of "Y" or "YES" or whatever...
            // Note that with a checkbox, only the first value matters, so we will only
            // worry about values[0] and not values[1] (the "unchecked" value, if exists).
            if (values[0] == "Y" || values[0] == "YES") {
                values[0] = "true";
            }
        }
        string value = String.Join(",", values);
        ValueProviderResult vpr = new ValueProviderResult(values, value, null);
        dict.Add(key, vpr);
    }
    return dict;
}

Ваш контроллер должен будет принять NameValueCollection (или FormCollection) в своих параметрах, и вам нужно будет передать ваш сгенерированный ("очищенный") словарь поставщиков значений методу UpdateModel. Я не проверял это точно, но моя версия работает очень похоже на меня. Желаем удачи!

1 голос
/ 02 июня 2009

Вполне возможно, что на ваш сайт попали спам-боты, представляющие это значение, а не реальные пользователи. Чем больше сайтов, к которым я добавляю автоматическое ведение журнала и электронную почту, тем больше таких типов «проб» и ошибок (хотя и не совсем того типа, который вы упомянули, с «Y» для флажка), которые я вижу накапливаясь в мой почтовый ящик. Ваша регистрация также захватывает остальную часть отправленного содержания формы?

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