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

Более простое решение:

В views.py используйте скобки CsrfExemptMixin и authentication_classes:

# views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from django.views.decorators.csrf import csrf_exempt
from braces.views import CsrfExemptMixin


class Object(CsrfExemptMixin, APIView):
    authentication_classes = []

    def post(self, request, format=None):
        return Response({'received data': request.data})
29
задан Deduplicator 2 November 2014 в 16:58
поделиться

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

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

40
ответ дан roryf 2 November 2014 в 16:58
поделиться

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

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

ModelState.Clear();
69
ответ дан Olivier Payen 2 November 2014 в 16:58
поделиться

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

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

ModelState["SomeText"].Value = 
    new ValueProviderResult("", "", CultureInfo.CurrentCulture);
7
ответ дан Çağdaş Tekin 2 November 2014 в 16:58
поделиться

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

1
ответ дан Kirsten 2 November 2014 в 16:58
поделиться

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

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

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

1
ответ дан MalachiteBR 2 November 2014 в 16:58
поделиться

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

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

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

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

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

<body onload="...">

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

0
ответ дан Jeff Ancel 2 November 2014 в 16:58
поделиться

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

0
ответ дан Mike Geise 2 November 2014 в 16:58
поделиться

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

РЕДАКТИРОВАТЬ : Я включаю соответствующий раздел исходного кода из расширения 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);
0
ответ дан tvanfosson 2 November 2014 в 16:58
поделиться

Делай с. например:

добавить:

ModelState.Clear();

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

0
ответ дан Maximilian Ast 2 November 2014 в 16:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: