表单提交后重置textarea的值

  1. 我想通过转到/ MyController / Message / 3向userID = 3发送消息
  2. 这将执行Message()[get]操作,我在文本区域中输入一些文本,然后单击Save以发布表单
  3. Message()[post]操作保存更改,将SomeText的值重置为空字符串并返回到视图。

此时我希望文本区域为空,因为我已将ViewData [“SomeText”]设置为string.Empty

为什么在发布操作后文本区域值不会更新为空字符串?

以下是行动:

[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(); } 

和相应的观点:

          

问题是HtmlHelper正在检索ModelState值,该值填充了发布的数据。 而不是通过重置ModelState来解决这个问题,为什么不重定向回[get]动作。 [post]动作还可以设置这样的临时状态消息:

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

在我看来,这似乎更正确的行为。

问题是您的ModelState重新填充了已发布的值。

您可以做的是在具有Post属性的Action上清除它:

 ModelState.Clear(); 

html帮助器从ModelState读取值。 而且没有优雅的方法来覆盖这种行为。

但是如果你在SaveToDB(ID, SomeText)之后添加这一行,它应该工作:

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

我尝试了一切,但只有当我做了这样的事情时才有效:

 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)); 

希望这可以帮助。

而不是使用清除整个模型状态的ModelState.Clear(),如果你愿意,你可以做ModelState.Remove(“SomeText”)。 或者在没有htmlhelper-extensions的情况下渲染Input。 它们被设计为从ModelState而不是Model(或viewdata)获取Value。

这是一种客户端行为。 我建议使用javascript。 如果你使用JQuery,你可以这样做:

  

我不再使用Javascript,但我相信常规JS就像:

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

(您可以在其中一个加载事件上执行此操作。

  

希望这可以帮助。

我相当肯定textarea正在从引擎盖下的Request.Form中获取值,因为ViewData [“SomeText”]为空。

模型状态是否可能因错误而更新? 我相信如果模型状态无效,它将从模型状态而不是从视图数据或模型中提取尝试值。

编辑 :我在下面的TextArea HtmlHelper扩展中包含了源代码的相关部分。 在我看来,它完全符合我的预期 – 如果出现模型错误,它会从模型状态中提取值,否则它会从ViewData中使用它。 请注意,在Post方法中,“SomeText”键在您设置之前不应该存在,即,它不会从响应GET的代码版本转发。

由于您明确向ViewData提供值,因此useViewData应为false, useViewData应为false,除非在模型状态中设置了错误。

  // 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); 

做s.th. 像这样:

加:

 ModelState.Clear(); 

在提交按钮操作方法的return语句之前。 适合我。 它可能适合你。