表单提交后重置textarea的值

时间:2009-04-25 00:05:32

标签: c# asp.net-mvc html-form

  1. 我想通过转到/ MyController / Message / 3
  2. 向userID = 3发送消息
  3. 执行Message()[get]操作,我在文本区域输入一些文本,然后单击Save以发布表单
  4. Message()[post]操作保存更改,将SomeText的值重置为空字符串并返回视图。
  5. 此时我希望文本区域为空,因为我已将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();
    }
    

    相应的观点:

    <%@ 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>
    

9 个答案:

答案 0 :(得分:68)

问题是您的ModelState会重新填充已发布的值。

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

ModelState.Clear();

答案 1 :(得分: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");
}

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

答案 2 :(得分:7)

html助手从ModelState中读取值。并且没有优雅的方法来覆盖这种行为。

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

ModelState["SomeText"].Value = 
    new ValueProviderResult("", "", CultureInfo.CurrentCulture);

答案 3 :(得分:1)

我尝试了所有的东西,但只有在我这样做的时候才有效:

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));

希望这有帮助。

答案 4 :(得分:1)

如果您愿意,可以使用ModelState.mlear()清除整个模型状态,而不是使用ModelState.Remove(“SomeText”)。或者在没有htmlhelper-extensions的情况下渲染Input。 它们被设计为从ModelState而不是Model(或viewdata)获取Value。

答案 5 :(得分:0)

模型状态是否可能因错误而更新?我相信如果模型状态无效,它将从模型状态而不是从视图数据或模型中提取尝试值。

修改: 我在下面的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);

答案 6 :(得分:0)

这是一种客户端行为。我建议使用javascript。如果你使用JQuery,你可以这样做:

<script type="text/javascript">
$(function(){ $("#SomeText").val("");});
</script>

我不再使用Javascript,但我相信常规JS就像:

document.getElementById("SomeText").value = "";

(您可以在其中一个加载事件中执行此操作。

<body onload="...">

希望这有帮助。

答案 7 :(得分:0)

由于ViewData [“SomeText”]为空,我相当肯定textarea正在从引擎盖下的Request.Form中获取值。

答案 8 :(得分:0)

做s.th.像这样:

添加:

ModelState.Clear();

在提交按钮操作方法的return语句之前。适合我。它可以为你工作。