Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 表单提交后重置textarea的值 我想通过转到/MyController/message/3向userID=3发送消息 这将执行Message()[get]操作,我在文本区域中输入一些文本,然后单击保存以发布表单 Message()[post]操作保存更改,将SomeText的值重置为空字符串并返回视图_C#_Asp.net Mvc_Forms - Fatal编程技术网

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