2009-06-01 2 views
5

Я использую флажок на форме ASP.NET MVC выглядеть примерно так:asp.net MVC флажок несогласованность

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

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

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

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

Y, ложные

ИЛИ

N, ложная

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

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

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

истинные, ложные

если проверка или

фа lse

если не проверено. Итак, откуда взялись N и Y?

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

Любые мысли?

+0

Y и N? Разве это не то, что использует Microsoft Jet (используется Access) для своих логических полей? – Powerlord

+0

Возможно, но поскольку это не имеет никакого отношения к Jet или Access, я не уверен, что это релевантно. – Chris

+0

Переходя к сообщению, которое я положил в теперь удаленном ответе: я просто проверил спецификацию HTML, и значение по умолчанию для флажка подразумевается как «включено», значение не задано; Я понятия не имею, откуда можно получить Y или N, если это не ASP.NET MVC. – Powerlord

ответ

1

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

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

Любые мысли о решении этой проблемы будут оценены.

+2

Почему это было отмечено как ответ, когда это явно вопрос ??????? –

1

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

+0

Да, а остальные данные выглядят солидно. Это проблема. Я действительно чувствую, что это действительные материалы. – Chris

1

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

Идея состоит в том, что вы пройдете через опубликованные поля формы и зафиксируете значения «сломанных» флажков. Вы можете создать строку ValueProviderDictionary a.k.a. IDictionary <, ValueProviderResult >, а затем передать это вашему методу 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

Я думал, что это должно быть обновлено, чтобы не просто обнаружить «Y» или «ДА» в ваших полях флажков, а обнаружить * ничего *, кроме строк «true» или «false» ... (Все, что не признано, должно быть установите значение false.) – Funka

2

У нас была эта же проблема в проекте, над которым я работаю (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" /> 
Смежные вопросы