asp.net-mvc-2 - isvalid - validar formulario asp.net mvc
Textbox vuelve al valor anterior mientras que Modelstate es válido en devolución de datos (2)
Tal vez me falta algo, pero cuando tengo un formulario que se vuelve a publicar en la misma acción, el valor del cuadro 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.
Sin embargo, si borro el estado del modelo en HttpPost Action (el comentario en el código), todo funciona como se esperaba.
¿Me estoy perdiendo de algo?
Aquí está el código:
Modelo:
public class MyModel
{
public int MyData { get; set; }
}
Ver:
<%@ 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);
}
}
Debería usar el patrón Post-Redirect-Get o no usar los Html Helpers.
Referencia: http://blogs.msdn.com/b/simonince/archive/2010/05/05/asp-net-mvc-s-html-helpers-render-the-wrong-value.aspx
Básicamente, MVC espera que cualquier nueva ModelState
de una publicación sea un error de validación, y reutiliza los datos publicados (vea ModelState
) para ModelState
que los datos del modelo. La guía es no usar ModelState.Clear()
.
Acabo de encontrar una respuesta a esto en línea.
El truco es borrar el modelo de estado 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, lee estos 2 artículos