2011-01-06 11 views
11

Tal vez me falta algo, pero cuando tengo un formulario que publica de nuevo en la misma acción, el valor de la caja de texto vuelve al valor anterior. El siguiente ejemplo debe incrementar el valor en el cuadro de texto en cada POST. Esto no sucede, el valor en el modelo se incrementa y el modelo es válido.Textbox vuelve al valor antiguo mientras Modelstate es válido en la devolución de datos

SI, sin embargo, borro el estado del modelo en HttpPost Action (el comentario en el código), todo funciona como se esperaba.

¿E-cando algo?

Aquí está el código:

Modelo:

public class MyModel 
{ 
    public int MyData { get; set; } 
} 

Vista:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" 
Inherits="System.Web.Mvc.ViewPage<MvcApplication1.Models.MyModel>" %> 

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 
<% using (Html.BeginForm()) {%> 
    <%: Html.TextBoxFor(m => m.MyData)%> (<%: Model.MyData%>) 
        <%: Html.ValidationMessageFor(m => m.MyData) %> <br /> 
    State :<%: ViewData["State"] %> <br /> 
    <input type="submit" /> 
<% } %> 
</asp:Content> 

controlador:

public class HomeController : Controller 
{ 
    [HttpGet] 
    public ActionResult Index() 
    { 
     return View(new MyModel { MyData = 0 }); 
    } 

    [HttpPost] 
    public ActionResult Index(MyModel myModel) 
    { 
     // ModelState.Clear(); 
     ViewData["State"] = "invalid"; 
     if (ModelState.IsValid) 
      ViewData["State"] = "Valid"; 

     var model = new MyModel { MyData = myModel.MyData + 1 }; 
     return View(model); 
    } 

} 

Respuesta

8

Acabo de encontrar una respuesta a esto en línea.

El truco es despejar el ModelState antes de devolver el Modelo

[HttpPost] 
public ActionResult Index(MyModel myModel) 
{ 
    // ModelState.Clear(); 
    ViewData["State"] = "invalid"; 
    if (ModelState.IsValid) 
     ViewData["State"] = "Valid"; 

    var model = new MyModel { MyData = myModel.MyData + 1 }; 

    ModelState.Clear(); 

    return View(model); 
} 

Para más detalles leer estos 2 artículos

http://forums.asp.net/p/1527149/3687407.aspx

Asp.net MVC ModelState.Clear

+0

Gracias. Sabía que limpiar el ModelState funcionaría, simplemente no sabía por qué tenía que hacerse para un modelo válido. El primer enlace tiene algunos comentarios de Brad Wilson explicando que esto es por diseño, la vista siempre usará ModelState si está disponible, independientemente de si el modelo es válido o no. Una solución que también funciona es redirigir a una acción en lugar de devolver el ver de nuevo (causa que usará el ModeloEstado disponible). –

+0

¡Muchas gracias! Me ayudó también ... Funciona muy bien. – Aaron

+0

Aparentemente no debes borrar el estado del modelo - ver http://blogs.msdn.com/b/simonince/archive/2010/05/05/asp-net-mvc- s-html-helpers-render-the-wrong-value.aspx –

Cuestiones relacionadas