Restablece el valor de textarea después del envío del formulario

  1. Deseo enviar un mensaje a userID = 3 yendo a / MyController / Message / 3
  2. Esto ejecuta la acción Mensaje () [obtener], ingreso texto en el área de texto y hago clic en Guardar para publicar el formulario
  3. La acción Message () [post] guarda los cambios, restablece el valor de SomeText a una cadena vacía y vuelve a la vista.

En este punto, espero que el área de texto esté vacía porque he configurado ViewData [“SomeText”] en string.Empty

¿Por qué el valor del área de texto no se actualiza a una cadena vacía después de la acción posterior?

Estas son las acciones:

[AcceptVerbs(HttpVerbs.Get)] public ActionResult Message(int ID) { ViewData["ID"] = ID; return View(); } [AcceptVerbs(HttpVerbs.Post)] public ActionResult Message(int ID, string SomeText) { // save Text to database SaveToDB(ID, SomeText); // set the value of SomeText to empty and return to view ViewData["SomeText"] = string.Empty; return View(); } 

Y la vista correspondiente:

          

El problema es que HtmlHelper está recuperando el valor de ModelState, que se llena con los datos publicados. En lugar de hackear esto al restablecer ModelState, ¿por qué no redirigir a la acción [get]? La acción [post] también podría establecer un mensaje de estado temporal como este:

 [AcceptVerbs(HttpVerbs.Post)] public ActionResult Message(int ID, string SomeText) { // save Text to database SaveToDB(ID, SomeText); TempData["message"] = "Message sent"; return RedirectToAction("Message"); } 

Esto me parece un comportamiento más correcto.

El problema es que su ModelState se vuelve a llenar con los valores publicados.

Lo que puede hacer es borrarlo en la Acción que tiene el atributo Publicar:

 ModelState.Clear(); 

Los helpers html leen el valor de ModelState. Y no hay una forma elegante de anular este comportamiento.

Pero si agrega esta línea después de SaveToDB(ID, SomeText) , debería funcionar:

 ModelState["SomeText"].Value = new ValueProviderResult("", "", CultureInfo.CurrentCulture); 

Intenté todo, pero solo funcionó cuando hice algo como esto:

 ModelState.Clear(); //This will clear the address that was submited viewModel.Address = new Address(); viewModel.Message = "Dados salvos com sucesso!"; return View("Addresses", ReturnViewModel(viewModel)); 

Espero que esto ayude.

En lugar de utilizar ModelState.Clear (), que borra todo el modelo de estado, puede hacer ModelState.Remove (“SomeText”), si así lo desea. O renderiza la entrada sin las extensiones htmlhelper-extensions. Están diseñados para tomar el valor de ModelState en lugar del modelo (o viewdata).

Ese es un comportamiento de cliente. Yo recomendaría usar javascript. Si usas JQuery, puedes hacerlo así:

  

Ya no uso Javascript, pero creo en JS regular que es como:

 document.getElementById("SomeText").value = ""; 

(Haría esto en uno de los eventos de carga.

  

Espero que esto ayude.

Estoy bastante seguro de que el área de texto está agarrando el valor del Request.Form bajo el capó porque ViewData [“SomeText”] está vacío.

¿Es posible que el estado del modelo se haya actualizado con un error? Creo que extraerá el valor del bash del estado del modelo en lugar de ver los datos o el modelo si el estado del modelo no es válido.

EDIT : estoy incluyendo la sección relevante del código fuente de la extensión TextArea HtmlHelper a continuación. Me parece que hace exactamente lo que esperaba: si ha habido un error de modelo, extrae el valor del estado del modelo, de lo contrario lo usa de ViewData. Tenga en cuenta que en su método Post, la clave “SomeText” no debería existir hasta que la configure, es decir, no se transferirá desde la versión del código que responde al GET.

Dado que usted proporciona explícitamente un valor para useViewData , useViewData debe ser falso, useViewData debe ser falso a menos que se haya establecido un error en el estado del modelo.

  // If there are any errors for a named field, we add the css attribute. ModelState modelState; if (htmlHelper.ViewData.ModelState.TryGetValue(name, out modelState)) { if (modelState.Errors.Count > 0) { tagBuilder.AddCssClass(HtmlHelper.ValidationInputCssClassName); } } // The first newline is always trimmed when a TextArea is rendered, so we add an extra one // in case the value being rendered is something like "\r\nHello". // The attempted value receives precedence over the explicitly supplied value parameter. string attemptedValue = (string)htmlHelper.GetModelStateValue(name, typeof(string)); tagBuilder.SetInnerText(Environment.NewLine + (attemptedValue ?? ((useViewData) ? htmlHelper.EvalString(name) : value))); return tagBuilder.ToString(TagRenderMode.Normal); 

Hacer s.th. Me gusta esto:

añadir:

 ModelState.Clear(); 

antes de la statement de return del método de acción de botones de envío. Funciona para mi. Podría funcionar para ti.