2012-01-17 15 views
5

tengo una casilla de verificación de esta manera:Asp.Net MVC 2 Casilla siempre falsas en el modelo

<%= Html.CheckBoxFor(x => x.IsSendingQualitySurvey) %>/> 

al comprobar la casilla de verificación y presentación, puedo obtener los valores típicos 2 forman:

IsSendingQualitySurvey: true 
IsSendingQualitySurvey: false 

Este es perfectamente válido para la forma en que mvc modelbinder maneja las casillas de verificación.

Luego, en la acción del controlador:

[HttpPost] 
public ActionResult Edit(Guid id, TicketEditViewModel ticketEditViewModel) 

ticketEditViewModel.IsSendingQualitySurvey (un bool normal) siempre es falsa.

No tengo ningún ligante modelo personalizado y funciona en otro lado. Curiosamente he tenido el mismo problema en otra vista hace ya bastante tiempo, donde tuve que crear manualmente la entrada, se ve así:

<input type="checkbox" value="true" name="<%=Html.NameFor(x => x.IsRequestingVisit) %>" id="<%=Html.NameFor(x => x.IsRequestingVisit) %>" /> 

Esto funcionó, pero cuando he copiado exactamente el mismo a lo largo la otra vista, el valor sigue siendo siempre falso.

Wheres the catch?

Gracias.

Respuesta

1

El encuadernador de modelo probablemente no recoja la encuadernación. Mi consejo es cambiar su acción a:

ligante
[HttpPost] 
public ActionResult Edit(Guid id, TicketEditViewModel model) 

El modelo quiere encontrar propiedades en la Solicitud que tienen un prefijo que coincide con el nombre de objeto. Como no existe un prefijo de denominación en el lado del cliente, no hay propiedades con el prefijo "ticketEditViewModel".

La alternativa es el nombre de una variable en la página:

<% var ticketEditViewModel = Model; %> 
<%= Html.CheckBoxFor(model => ticketEditViewModel.IsSendingQualitySurvey) %> 
+0

me olvidaba decir que el modelo es en realidad llena de la manera correcta, sólo la falta de una propiedad. Además, no creo que al encuadernador de modelos le importe el prefijo, ya que ni siquiera se transfiere a la entrada resultante, ¿está seguro de esto? –

+1

El encuadernador de modelos analiza los valores contenidos en la Cadena de consultas o la Colección de formularios e intenta vincular las propiedades por su nombre. Sus campos ID/Nombre en el lado del cliente (generados por los ayudantes HTML) contienen el espacio de nombres y son el resultado directo de la convención de nomenclatura que utiliza para las variables. Si tiene modelos complejos o si crea variables en la página, notará que HTML Helper generará prefijos en sus controles que coincidan con los nombres de sus variables. Puede haber algo de lógica en la carpeta del modelo que cubra los nombres que no coinciden, pero no puedo asegurarlo sin desenterrar un reflector. –

+0

Hmm, ¿entonces tal vez porque estoy pasando dos parámetros, la carpeta podría introducir espacios de nombres y en ese caso no encontrar el parámetro del modelo debido a mis convenciones? Aún no he visto esos espacios de nombres. Lo investigaré mañana, gracias hasta ahora. –

1

EDITAR consiguió el lado equivocado de la vara ... lo siento

Ha intentado ir a buscar el valor bruto de los datos POST de este modo:

En el controlador:

[HttpPost] 
public ActionResult Edit(Guid id, TicketEditViewModel ticketEditViewModel, 
              FormCollection fc) { 

    if(fc["IsSendingQualitySurvey"].Contains("true")) { 
     //Do something. 
    } 
}  

En la Vista:

<%= Html.CheckBoxFor(model => model.IsSendingQualitySurvey) %> 

Espero que esto ayude ..

+0

No encontré nada a su alrededor, así que usé 'Request.Form [" IsSendingQualitySurvey "]. Contiene (" true ")', a pesar de que es tan feo = ( –

0

Por siguiente modelo:

public class {StartViewModel

public string Id{ get; set; } 

public string Name { get; set; } 

public bool Accept { get; set; } 

}

-> Aceptar = false.

La solución: Cambiar public bool Aceptar {obtener; conjunto; } a cadena pública Aceptar {obtener; conjunto; }

Al enviar, si la casilla de verificación está marcada, el valor "Aceptar" = "on". Por cierto, puede detectar el valor comprobado.

0

No estoy seguro de si esto funcionará para usted, pero de hecho resolvió el mismo problema para mí. Trate de añadir (no sustituir) un campo oculto de la propiedad del mismo modelo como este:

@Html.HiddenFor(x => x.IsSendingQualitySurvey) 
Cuestiones relacionadas