表单提交后重置textarea的值

xra*_*inx 29 c# forms asp.net-mvc

  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();
}
Run Code Online (Sandbox Code Playgroud)

和相应的观点:

<%@ 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>
Run Code Online (Sandbox Code Playgroud)

Oli*_*yen 69

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

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

ModelState.Clear();
Run Code Online (Sandbox Code Playgroud)

  • 这应该被标记为最佳答案。我必须在 ViewBag 中保留一个布尔值,并且 RedirectToAction() 函数从中删除数据。 (2认同)

ror*_*ryf 40

问题是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");
}
Run Code Online (Sandbox Code Playgroud)

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

  • 我认为这比清除ModelState更好.如果你正在做一个帖子,那么你真的不需要更多的消息回来.如果你觉得需要返回一个完整的模型,那么你应该首先做一个get.还要研究PRG模式; 它可能会澄清一点.这也可以解决您刷新时有时会获得的恼人的浏览器消息,并询问您是否要重新发布表单. (2认同)

Çağ*_*kin 7

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

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

ModelState["SomeText"].Value = 
    new ValueProviderResult("", "", CultureInfo.CurrentCulture);
Run Code Online (Sandbox Code Playgroud)