表单提交后重置textarea的值

Posted

技术标签:

【中文标题】表单提交后重置textarea的值【英文标题】:Reset the value of textarea after form submission 【发布时间】:2009-04-25 00:05:32 【问题描述】:
    我想通过转到 /MyController/Message/3 向 userID=3 发送消息 这会执行Message() [get] 动作,我在文本区域输入一些文本并点击保存以发布表单 Message() [post] 操作保存更改,将 SomeText 的值重置为空字符串并返回视图。

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

为什么 post action 后文本区域的值没有更新为空字符串?

以下是操作:

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

以及对应的视图:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master"
    Inherits="System.Web.Mvc.ViewPage" %>
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server">
<% using (html.BeginForm()) 
    %>
      <%= Html.Hidden("ID", ViewData["ID"])%>
      <label for="SomeText">SomeText:</label>
      <%= Html.TextArea("SomeText", ViewData["SomeText"]) %>
      <input type="submit" value="Save" />
<%  %>
</asp:Content>

【问题讨论】:

【参考方案1】:

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

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

ModelState.Clear();

【讨论】:

这应该被标记为最佳答案。我必须在 ViewBag 中保留一个布尔值,并且 RedirectToAction() 函数会从中删除数据。【参考方案2】:

问题是 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 更好。如果您正在发帖,那么您真的只需要回复一条消息即可。如果您觉得有必要返回一个完整的模型,那么您可能应该首先进行获取。还要研究 PRG 模式;它可能会澄清一点。这也可以解决您有时会在刷新时收到的烦人的浏览器消息,它会询问您是否要重新发布表单。 我正是这样做的,它正在处理我的大多数表单,除了少数(可能是 2 或 3 个)。为什么页面仍然呈现来自ModelState 的值,即使在发布它并在Save(MyModel vm) 末尾使用RedirectToAction("save", new id = 0); 之后?除了ModelState.Clear(),我还能做什么来重置表单? 我确实找到了解决方案。 UpdateTargetIdAjax.BeginForm 提供了不正确的 Id【参考方案3】:

html 助手从 ModelState 中读取值。而且没有优雅的方法可以覆盖这种行为。

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

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

【讨论】:

【参考方案4】:

我尝试了所有方法,但只有在我这样做时才有效:

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

希望这会有所帮助。

【讨论】:

ReturnViewModel?这是什么方法? 不记得了:D【参考方案5】:

如果你愿意,你可以使用 ModelState.Remove("SomeText"),而不是使用 ModelState.Clear() 来清除整个模型状态。或者在没有 htmlhelper-extensions 的情况下呈现输入。 它们旨在从 ModelState 而不是 Model(或 viewdata)中获取值。

【讨论】:

【参考方案6】:

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

<script type="text/javascript">
$(function() $("#SomeText").val(""););
</script>

我不再使用 Javascript,但我相信普通的 JS 是这样的:

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

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

<body onload="...">

希望这会有所帮助。

【讨论】:

我不这么认为。在推送到我的浏览器之前,视图会在服务器端呈现。 我同意,但我正在考虑快速修复。不太清楚为什么它会那样回来。它总是在回帖中为我这样做,认为这是一个功能。【参考方案7】:

由于 ViewData["SomeText"] 为空,我相当确定 textarea 正在从后台的 Request.Form 中获取值。

【讨论】:

所以您建议的正确方法如下? Request.Form["SomeMessage"] = string.Empty; 否 -- Request.Form 未被 HtmlHelper 扩展使用。 我不会这么说的。您可以命名一个查询字符串参数标题,并将您的文本框命名为标题,文本框将具有查询字符串的值。他们也确实从 Request.Form 中提取了他们的值,否则它将如何获取值以填充表单或在表单发布时返回结果。【参考方案8】:

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

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

由于您明确地为 ViewData 提供了一个值,useViewData 应该为 false,attemptedValue 应该为 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);

【讨论】:

我认为没有任何错误。我以另一种形式遇到了同样的问题。几天来我一直在挠头,但我找不到为什么会这样。当您无法控制发布操作后表单中显示的内容时,这非常烦人。我想知道我是否在做任何不寻常或错误的事情。【参考方案9】:

做某事。像这样:

添加:

ModelState.Clear();

在提交按钮操作方法的return 语句之前。为我工作。它可以为你工作。

【讨论】:

以上是关于表单提交后重置textarea的值的主要内容,如果未能解决你的问题,请参考以下文章

提交后清除reactJs textarea

通过JS改变textarea的值后,但提交表单时还是默认的,为啥!!!

表单提交后 Textarea 不保留其内容

提交后清除 textarea 字段中的值

来自ckeditor textarea的ajax表单提交值之后没有通过邮件发送

提交后重置表单[重复]