2010-03-08 16 views
15

¿Qué pasa con esto? La variable viewmodel es un bool con valor verdadero.Boolean con html helper Hidden and HiddenFor

<%= Html.HiddenFor(m => m.TheBool) %> 
<%= Html.Hidden("IsTimeExpanded",Model.TheBool) %> 
<input type="hidden" value="<%=Model.TheBool%>" name="TheBool" id="TheBool"> 

Resultados en:

<input id="TheBool" name="TheBool" value="False" type="hidden"> 
<input id="TheBool" name="TheBool" value="False" type="hidden"> 
<input value="True" name="TheBool" id="TheBool" type="hidden"> 

¿Qué estoy haciendo mal? ¿Por qué los ayudantes no funcionan como se esperaba?

+2

la respuesta está en http://stackoverflow.com/questions/4710447/asp-net-mvc-html-hiddenfor-with-wrong-value –

+0

Este comentario debe ser la respuesta correcta - Los ayudantes usan valores POST primero. Entonces, si está actualizando TheBool en la devolución de datos y luego muestra su modelo sin hacer un redireccionamiento/obtención, es posible que esté mostrando el valor incorrecto. –

Respuesta

13

1) utilizan diferentes) IDS (únicas

2) no utilice esta ayuda, utilice

<input type="hidden" name="the-name" 
    value="<%= Html.AttributeEncode(Model.TheBool) %>" id="TheBool_1216786" /> 
+0

La identificación es solo por ejemplo, configurada automáticamente por el ayudante y no tiene nada que ver con el resultado. La pregunta era: ¿por qué los ayudantes no funcionan como se esperaba? – Martin

+0

Es una pregunta que debe dirigirse a la EM, muchas personas tienen un comportamiento tan extraño (encontré al menos las mismas solicitudes de problemas de otra persona). Traté de ayudar a resolverlo o evitarlo. No trabajo en MS :) No tengo ningún agradecimiento tuyo, así que no entiendo por qué eres tan crítico con mi ayuda. – garik

+0

Aprecio que trates de ayudarme. Es solo que no me ayudaste. De hecho, no proporcionó información relevante que no estuviera incluida en la pregunta. Por favor dirígeme a la pregunta que mencionaste. – Martin

0

He aquí un ejemplo de la maquinilla de afeitar:

html: 
@Html.HiddenFor(x => Model.TheBool, new { @id = "hdnBool" }) 

javascript: 
alert($('#hdnBool').val()); 

model: 
public class MyModel() 
{ 
    public bool TheBool{ get; set; } 
} 
0

como respondida here la El problema es que los ayudantes de HTML por defecto usan los valores publicados (si están disponibles) y luego se refieren al modelo. Personalmente, no creo que esto tenga mucho sentido común y ahora nos preguntamos cuántos errores más existen en nuestra plataforma.

De todos modos, la solución publicado en la respuesta antes mencionada va a resolver el problema, sólo tiene que añadir esta línea antes de su regreso desde el controlador:

ModelState.Remove("TheBool") 

Y sí, es un poco basura porque sólo se puede utilizar una cadena referencia ... pero funciona.

+0

Sí - esto funciona, pero me Sé que en los próximos años cuando mire el código, estaré pensando "por qué he hecho eso". – AntDC

+1

No puedo estar más de acuerdo y recomendaría de todo corazón los comentarios liberales sobre el llamado "arreglo".Sin embargo, es un déficit del marco y uno que no se puede evitar sin tal inconveniente; es decir, anular OnActionExecute (o algún dispositivo de este tipo) en un intento de automatizar esto solo generaría comportamientos y problemas inesperados adicionales. –

0

Tuve similares y terminé por rodearlo así. La situación es que el usuario desea un Guardar y confirme guardar escenario ....

yo decidimos utilizar la solución de abajo en lugar de

ModelSate.Remove("OperationConfirmed"); 

(lo que hace el trabajo) ya que creo que es más intuative ....

@{ 
    string btnSaveCaption = "Save Changes"; 
    if (Model.OperationConfirmed) 
    { 
    btnSaveCaption = "Confirm Save Changes"; 
    @Html.Hidden("OperationConfirmed", true) 
    }   
}