表单提交后重置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()
,我还能做什么来重置表单?
我确实找到了解决方案。 UpdateTargetId
的 Ajax.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的值的主要内容,如果未能解决你的问题,请参考以下文章
通过JS改变textarea的值后,但提交表单时还是默认的,为啥!!!