2011-01-29 19 views
41

Tengo un proceso de importación de archivos de múltiples pasos. Tengo un formulario oculto de entrada en mi opinión de que estoy tratando de poblar con el "CurrentStep" del modelo de vista.Hiddenfor no conseguir valor correcto de vista del modelo

<% = Html.HiddenFor(model => model.CurrentStep) %> 

CurrentStep es un Enum y siempre obtengo el valor predeterminado en lugar del que proporcioné al modelo de vista. Por otro lado esto me pone el valor correcto:

<p><% = Model.CurrentStep %></p> 

que darse cuenta de que pude solo código de la mano de la entrada oculta pero quiero saber: ¿qué estoy haciendo mal? ¿Hay una mejor manera de realizar un seguimiento del paso actual entre los POST?

Gracias de antemano.

+0

Muéstrenos el código de su formulario (como Html.BeginForm()), por favor. –

Respuesta

62

Lo que está haciendo mal es que está tratando de modificar el valor de una variable POSTed en la acción de su controlador. Así que supongo que usted está tratando de hacer esto:

[HttpPost] 
public ActionResult Foo(SomeModel model) 
{ 
    model.CurrentStep = Steps.SomeNewValue; 
    return View(model); 
} 

y html ayudantes como HiddenFor siempre utilice primero el valor publicado y después de que el valor en el modelo.

Así que hay un par de posibilidades:

  1. quitar el valor de la ModelState:

    [HttpPost] 
    public ActionResult Foo(SomeModel model) 
    { 
        ModelState.Remove("CurrentStep");    
        model.CurrentStep = Steps.SomeNewValue; 
        return View(model); 
    } 
    
  2. generar manualmente el campo oculto

    <input type="hidden" name="NextStep" value="<%= Model.CurrentStep %>" /> 
    
  3. Escribir una costumbre Ayudante que usará el valor de su modelo y no el que será ING POSTeado

+2

Gracias. Pensé que el objetivo de un modelo de vista era pasar información compleja (más compleja de lo que debería figurar en ViewData al menos) a la Vista. ¿Entonces la Vista no está usando el Modelo de Vista que le estoy pasando? ¿Es solo obtener lo que haya en los vars de POST? Eso no tiene mucho sentido para mí. – user427875

+4

Gracias, gran respuesta. Para (1) también puede usar ModelState.Clear() para eliminar todos los valores. – tkerwood

+2

@Darin Dimitrov: tuvimos un problema similar, y su publicación nos ayudó mucho. Pero lo que no obtenemos, y quizás tengas la respuesta, es ¿POR QUÉ hace esto? ¿Por qué toma el valor del POST, aunque aparentemente lo anula con el valor del modelo en el archivo .cshtml? –

4

Mi solución fue usar la segunda opción de Darin, debido a la opción 1 (limpieza del modelo de estado) significa codificar duro una cadena (y la convención de nombres puede ser complicado con modelos complejos), y quería evitar opción 3 porque ya tengo tantos ayudantes personalizados.

<input type="hidden" name="@Html.NameFor(x => Model.SomeId)" value="@Model.SomeId" />

Sólo un recordatorio de que puede utilizar Html.NameFor mantener las cosas limpias.

Cuestiones relacionadas