C# 表单提交后重置textarea的值 我想通过转到/MyController/message/3向userID=3发送消息 这将执行Message()[get]操作,我在文本区域中输入一些文本,然后单击保存以发布表单 Message()[post]操作保存更改,将SomeText的值重置为空字符串并返回视图
此时,我希望文本区域为空,因为我已将C# 表单提交后重置textarea的值 我想通过转到/MyController/message/3向userID=3发送消息 这将执行Message()[get]操作,我在文本区域中输入一些文本,然后单击保存以发布表单 Message()[post]操作保存更改,将SomeText的值重置为空字符串并返回视图,c#,asp.net-mvc,forms,C#,Asp.net Mvc,Forms,此时,我希望文本区域为空,因为我已将ViewData[“SomeText”]设置为string.empty 为什么在post操作后文本区域值未更新为空字符串? 以下是行动: [AcceptVerbs(HttpVerbs.Get)] public ActionResult Message(int ID) { ViewData["ID"] = ID; return View(); } [AcceptVerbs(HttpVerbs.Post)] public Action
ViewData[“SomeText”]
设置为string.empty
为什么在post操作后文本区域值未更新为空字符串?
以下是行动:
[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>
一些文字:
模型状态是否可能已更新为错误?我相信,如果模型状态无效,它将从模型状态而不是视图数据或模型中提取尝试的值
编辑:
我在下面的TextArea HtmlHelper扩展中包含了的相关部分。在我看来,它完全符合我的预期——如果出现模型错误,它将从模型状态中提取值,否则它将从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);
这是客户端行为。我建议使用javascript。如果使用JQuery,可以这样做:
<script type="text/javascript">
$(function(){ $("#SomeText").val("");});
</script>
[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.Clear();
//This will clear the address that was submited
viewModel.Address = new Address();
viewModel.Message = "Dados salvos com sucesso!";
return View("Addresses", ReturnViewModel(viewModel));
(您可以在其中一个加载事件上执行此操作
<body onload="...">
希望这能有所帮助。我很确定textarea正在从请求中获取值。由于ViewData[“SomeText”]是空的,所以表单隐藏在引擎盖下。html帮助程序从ModelState读取值。没有优雅的方法来覆盖此行为 但是如果在
SaveToDB(ID,SomeText)
之后添加这一行,它应该可以工作:
ModelState["SomeText"].Value =
new ValueProviderResult("", "", CultureInfo.CurrentCulture);
问题是您的ModelState被发布的值重新填充 您可以在具有Post属性的操作上清除它:
ModelState.Clear();
问题是HtmlHelper正在检索ModelState值,该值填充了已发布的数据。与其通过重置ModelState来绕过此问题,不如重定向回[get]操作。[post]操作还可以设置一条临时状态消息,如下所示:
<script type="text/javascript">
$(function(){ $("#SomeText").val("");});
</script>
[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.Clear();
//This will clear the address that was submited
viewModel.Address = new Address();
viewModel.Message = "Dados salvos com sucesso!";
return View("Addresses", ReturnViewModel(viewModel));
在我看来,这似乎是更正确的行为。我尝试了所有方法,但只有在我做了这样的事情时才奏效:
<script type="text/javascript">
$(function(){ $("#SomeText").val("");});
</script>
[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.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,如果需要,可以执行ModelState.Remove(“SomeText”),或者在不使用htmlhelper扩展的情况下呈现输入。 它们被设计为从ModelState而不是模型(或viewdata)中获取值。执行s.th。如下所示:
<script type="text/javascript">
$(function(){ $("#SomeText").val("");});
</script>
[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.Clear();
//This will clear the address that was submited
viewModel.Address = new Address();
viewModel.Message = "Dados salvos com sucesso!";
return View("Addresses", ReturnViewModel(viewModel));
加:
在提交按钮操作方法的
return
声明之前。对我有效。它可以对你有效。我不认为有任何错误。我在另一种形式上也遇到过同样的问题。我已经搔了几天的头,但我不知道为什么会发生这种情况。当你无法控制什么时,这很烦人在post操作后,t出现在您的表单中。我想知道我是否做了任何异常或错误的事情。我不这么认为。视图在推送到浏览器之前会在服务器端渲染。我同意,但我正在考虑快速修复。不太清楚为什么它会这样返回。我一直在回发帖时这样做,认为这是一项功能e、 因此,您建议的正确方法如下?Request.Form[“SomeMessage”]=string.Empty;No--Request.Form未被HtmlHelper扩展使用。我不会这么说。您可以命名一个querystring参数标题,让您的文本框具有名称标题,而文本框将具有querystring的值。此外,他们会从Request.Form中提取这些值。否则,它将如何获取值来填充表单或者在表单发布时返回结果。我确实认为这比只清除ModelState要好。如果你正在发布,那么你真的不需要更多的消息返回。如果你觉得需要返回完整的模型,那么你可能首先应该做一个get。还可以研究PRG模式;它可能会澄清这有一点。这也可以修复当你刷新时有时会收到的恼人的浏览器消息,它会询问你是否要重新发布表单。我正是这么做的,它正在处理我的大多数表单,除了少数(可能2或3个)。为什么即使在发布并使用重定向到操作(“保存”,新的{id=0});
在保存(MyModel vm)
结束后,页面仍然呈现来自模型状态的值呢?发布后除了模型状态之外,我还能做些什么来重置表单。清除()
?我确实找到了解决方案。Ajax的UpdateTargetId
提供了不正确的Id
。这应该被标记为最佳答案。我必须在ViewBag和RedirectToAction()中保留一个布尔值函数从中删除数据。ReturnViewModel
?这是什么方法?不记得了:D