Сбросить значение textarea после отправки формы - PullRequest
29 голосов
/ 25 апреля 2009
  1. Я хочу отправить сообщение для userID = 3, перейдя в / MyController / Message / 3
  2. Это выполняет действие Message () [get], я вводю некоторый текст в текстовую область и нажимаю кнопку Сохранить, чтобы опубликовать форму
  3. Действие 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>

Ответы [ 9 ]

68 голосов
/ 06 мая 2009

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

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

ModelState.Clear();
40 голосов
/ 06 мая 2009

Проблема в том, что 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");
}

Мне кажется, это более правильное поведение.

7 голосов
/ 25 апреля 2009

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

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

ModelState["SomeText"].Value = 
    new ValueProviderResult("", "", CultureInfo.CurrentCulture);
1 голос
/ 04 сентября 2015

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

1 голос
/ 21 октября 2014

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

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

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

0 голосов
/ 18 октября 2016

До с.т. как это:

добавить:

ModelState.Clear();

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

0 голосов
/ 25 апреля 2009

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

0 голосов
/ 25 апреля 2009

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

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

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

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

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

<body onload="...">

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

0 голосов
/ 25 апреля 2009

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

EDIT : Я включил соответствующий раздел исходного кода из расширения 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);
...