Подтвердить что ты не робот

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

  • Я хочу отправить сообщение пользователюID = 3, перейдя в /MyController/Message/ 3
  • Выполняет действие Message() [get], я ввожу текст в текстовую область и нажимаю "Сохранить", чтобы опубликовать форму
  • Действие Message() [post] сохраняет изменения, сбрасывает значение SomeText для удаления строки и возвращает в представление.

В этот момент я ожидаю, что текстовая область будет пустой, потому что я установил 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>
4b9b3361

Ответ 1

Проблема заключается в том, что 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

Проблема заключается в том, что ваш ModelState повторно заполняется опубликованными значениями.

Что вы можете сделать, это очистить его от Action с атрибутом Post:

ModelState.Clear();

Ответ 3

Помощники html считывают значение из ModelState. И нет элегантного способа переопределить это поведение.

Но если вы добавите эту строку после SaveToDB(ID, SomeText), она должна работать:

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

Ответ 4

Я все пробовал, но работал только тогда, когда делал что-то вроде этого:

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

Надеюсь, что это поможет.

Ответ 5

Вместо использования ModelState.Clear(), который очищает целое модельное состояние, вы можете сделать ModelState.Remove( "SomeText" ), если хотите. Или визуализируйте Input без htmlhelper-extensions. Они предназначены для принятия значения из ModelState вместо Model (или viewdata).

Ответ 6

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

ИЗМЕНИТЬ: Я включил соответствующий раздел исходного кода из расширения TextArea HtmlHelper ниже. Мне кажется, что он делает именно то, что я ожидал - если была ошибка модели, она вытягивает значение из состояния модели, иначе оно использует его из ViewData. Обратите внимание, что в вашем методе Post ключ "SomeText" не должен существовать до его установки, т.е. Он не будет перенесен с версии кода, который отвечает на GET.

Поскольку вы явно указываете значение ViewData, useViewData должно быть ложным, attemptedValue должно быть ложным, если в состоянии модели не было установлено значение.

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

Ответ 7

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

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

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

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

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

<body onload="...">

Надеюсь, что это поможет.

Ответ 8

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

Ответ 9

Сделай это. например:

добавить:

ModelState.Clear();

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