Сбросить значение textarea после отправки формы

  1. Я хочу отправить сообщение userID=3, перейдя в /MyController/Message / 3
  2. это выполняет действие Message () [get], я ввожу текст в текстовую область и нажимаю Save, чтобы опубликовать форму
  3. Message() [post] действие сохраняет изменения, сбрасывает значение SomeText в пустую строку и возвращается в представление.

на данный момент я ожидаю, что текстовая область будет пустой, потому что я установил ViewData ["SomeText"] в строка.Пусто

почему значение текстовой области не обновляется до пустой строки после действия 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>

9 ответов


проблема в том, что 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:

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, вы можете сделать ModelState.Удалите ("SomeText"), если хотите. Или сделать вход без htmlhelper-расширения. Они предназначены для получения значения из ModelState вместо модели (или viewdata).


это поведение на стороне клиента. Я бы рекомендовал использовать javascript. Если вы используете jQuery, вы можете сделать это так:

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

Я больше не использую Javascript, но я верю в обычный JS, что это похоже:

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

(вы сделали бы это на одном из событий загрузки.

<body onload="...">

надеюсь, что это помогает.


Я уверен, что textarea захватывает значение из запроса.Форма под капотом, так как ViewData ["SomeText"] пуста.


возможно ли, что состояние модели было обновлено с ошибкой? Я считаю, что он вытащит значение попытки из состояния модели, а не из данных представления или модели, если состояние модели недопустимо.

редактировать: В том числе в разделе исходный код из расширения 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);

Do s.th. вот так:

добавить:

ModelState.Clear();

до return инструкция метода действия кнопки отправки. Работать на меня. Это может сработать для тебя.