表单提交后重置textarea的值
- 我想通过转到/ MyController / Message / 3向userID = 3发送消息
- 这将执行Message()[get]操作,我在文本区域中输入一些文本,然后单击Save以发布表单
- 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
语句之前。 适合我。 它可能适合你。