2012-08-31 22 views
5

En una serie de situaciones he tenido un problema cuando tengo un modelo que se crea en el servidor como resultado de valores devueltos. Al procesar el modelo, algunos de los valores del modelo se cambian y luego se vuelven a mostrar en la página. ¿Existe alguna manera fácil de anular el comportamiento que hace que el marco MVC use el valor POSTed en lugar del valor de mi modelo?MVC3: Cómo forzar a Html.TextBoxFor a utilizar el valor del modelo en lugar del valor POSTed

Ejemplo:

Modelo

public class MyModel { 
    public string Value1 { get; set; } 
} 

Controller

public MyController : Controller { 
    public ActionResult MyAction() { 
     var model = new MyModel(); 
     model.Value1 = "OldValue"; 
     return View(model); 
    } 
    [HttpPost] 
    public ActionResult MyAction(MyModel model) { 
     model.Value1 = "NewValue"; 
     return View(model); 
    } 
} 

Ver

@using(Html.BeginForm("MyAction", "My", FormMethod.Post) { 
    @Html.TextBoxFor(m => m.Value1) 
    <input type="submit"/> 
} 

Cuando primero se carga esta página, el cuadro de texto contendrá "OldValue". Después de hacer clic en enviar, el cuadro de texto todavía contiene "OldValue" ya que eso es lo que se envió de vuelta al servidor, pero quiero que cree la segunda página (después del POST) con el valor del modelo (NewValue).

¿Hay alguna manera fácil de decirle a MVC que se comporte de esta manera? No estoy seguro de qué se supone que debo hacer en esta situación para obtener el resultado deseado.

Nota: esto es todo pseudocódigo por lo que podría tener algunos errores, pero el concepto debería estar allí.

Respuesta

8

En su redirección de publicaciones (Publicar - Redirigir - Obtener patrón).

[HttpPost] 
public ActionResult MyAction(MyModel model) { 
    model.Value1 = "NewValue"; 
    return RedirectToAction("MyAction"); 
} 

EDITAR

Borrar el modelo de estado para pasar de nuevo a un modelo editado

[HttpPost] 
    public ActionResult MyAction(MyModel model) 
    { 
     var newModel = new MyModel(); 
     newModel = model; 
     ModelState.Clear(); 
     newModel.Value1 = "NewValue"; 
     return View(newModel); 
    } 
+0

Gracias por su sugerencia, pero se simplifica mi ejemplo y realmente no quiere simplemente redirigir a la GET. Supongo que puedo hacer que esto funcione, pero esperaba una solución que pudiera hacer que el modelo anule los valores POSTed. –

+0

@LeslieHanks: disculpa por el malentendido, mira mi edición. –

+0

Más detalles aquí: http://blogs.msdn.com/b/simonince/archive/2010/05/05/asp-net-mvc-s-html-helpers-render-the-wrong-value.aspx –

0

No hay una manera de hacerlo con los ayudantes incorporadas. Usted tiene que hacerlo de forma manual

El uso de ayudantes para obtener el nombre:

<input type="text" name="@Html.NameFor(m => m.MyField)" value="@Model.MyField"/> 
Cuestiones relacionadas