2009-06-01 27 views
5

estoy usando una casilla de verificación en un formulario ASP.NET MVC así:asp.net mvc casilla inconsistencia

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

La propiedad AgreeToRules en el modelo es un valor booleano. Durante la prueba, todo funcionó bien. Sin embargo, ahora que hemos ido en directo con esta aplicación, estoy viendo un grupo relativamente pequeño pero significativo número de errores con los siguientes mensajes:

System.Web.HttpUnhandledException: excepción de tipo Sistema'. Se lanzó Web.HttpUnhandledException ' . ---> System.InvalidOperationException: Falló la conversión del parámetro del tipo 'System.String' al tipo 'System.Boolean'. Consulte la excepción interna para obtener más información. ---> System.FormatException: Y no es un valor válido para Boolean. ---> System.FormatException: String no fue reconocido como un booleano válido.

Esto parece ocurrir cuando el motor vista intenta reproducir el formulario después de un poste, y el valor de la casilla de verificación que se devuelve desde el ValueProvider parece:

Y, falsa

O

N, falsa

el código HTML que se representa en la forma original se parece a:

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

Durante las pruebas, que esperaba (y mostré) el valor publicado para parecerse a:

verdadero, falso

si está marcada o

fa lse

si no se selecciona. Entonces, ¿de dónde viene el N y el Y?

Agregué el agente de usuario a la lista de información devuelta por el controlador de errores y parece (hasta ahora) que todos los errores se producen en Windows XP con FF 3.0.10, pero eso es exactamente con lo que he probado y el problema no existió durante la prueba.

¿Alguna idea?

+0

Y y N? ¿No es eso lo que utiliza Microsoft Jet (utilizado por Access) para sus campos booleanos? – Powerlord

+0

Quizás, pero como esto no tiene nada que ver con Jet o Access, no estoy seguro de que sea relevante. – Chris

+0

Voy a publicar algo. Puse una respuesta ahora eliminada: Acabo de verificar las especificaciones de HTML, y el valor predeterminado para una casilla de verificación está implícito que está "activado", no se da ningún valor; No tengo idea de dónde podrían proceder Y o N, a menos que sea ASP.NET MVC específico. – Powerlord

Respuesta

1

Bueno he encontrado el problema, y ​​pensé que había puesto aquí en caso de que otros la encuentren. Ciertos rellenos de formularios detectarán los campos usando los nombres que he usado e intentarán "completarlos" automáticamente estableciendo el valor en lo que el usuario haya usado previamente para campos con nombres similares. A partir de anoche, también recibo "SIN SUSCRIPCIÓN" y "SUSCRITO" como valores para una casilla llamada "OptIn".

Por lo tanto, la forma de llenado cambia el valor de la casilla de verificación para algo y el usuario comprueba la caja, lo que resulta en el valor inesperado de ser transmitida al servidor.

Cualquier idea sobre cómo tratar esto sería apreciada.

+2

¿Por qué se marcó esto como una respuesta cuando es claramente una pregunta ??????? –

1

Es muy posible que su sitio esté siendo golpeado por spambots que están enviando este valor, y no usuarios reales. Cuantos más sitios agregue el registro automático y el envío de correos electrónicos, más de estos tipos de "sondeos" y errores (aunque no exactamente del tipo que mencionas, con una "Y" para una casilla de verificación) que veo acumular en mi bandeja de entrada. ¿Su registro también captura el resto del contenido del formulario enviado?

+0

Sí, y el resto de los datos parece sólido. Ese es el problema. Realmente siento que estos son envíos válidos. – Chris

1

Hoy me ocurrió una solución para un problema similar que podría ser quizá ser adaptado para adaptarse a su necesidad particular. Hará "el trabajo" por lo que está preguntando, pero puede no ser la solución más reutilizable.

La idea es que usted tendrá que caminar a través de los campos del formulario enviado y fijar los valores de casilla de verificación "rotas". Puede crear una cadena ValueProviderDictionary a.k.a IDictionary <, ValueProviderResult > y luego transferirla a su método 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; 
} 

Su controlador tendrá que aceptar una NameValueCollection (o FormCollection) en sus parámetros, y usted tendrá que entregar su diccionario proveedor generada ("fregado") valor al método UpdateModel. No lo he probado exactamente, pero mi versión de esto funciona de manera muy similar para mí. ¡La mejor de las suertes!

+1

pensaba que esto debería actualizarse para no solo detectar "S" o "SÍ" en los campos de su casilla de verificación, sino para detectar * cualquier cosa * que no sean las cadenas "verdadero" o "falso" ... (Cualquier cosa no reconocida debe ser establecer en falso.) – Funka

2

Hemos tenido este mismo problema en un proyecto que estoy trabajando (MVC 2). Hemos resuelto mediante la sustitución de la ayudante de la llanura código html:

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

Después:

<input type="checkbox" name="Credit" value="true" validate="required" /> 
<input type="hidden" name="Credit" value="false" /> 
Cuestiones relacionadas