Более простое решение:
В 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})
Проблема в том, что 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 (), которая очищает все состояние модели, вы можете сделать ModelState.Remove ("SomeText"), если хотите. Или визуализируйте вход без расширений htmlhelper. Они предназначены для получения значения из ModelState вместо Model (или viewdata).
Я попробовал все, но сработало только тогда, когда я сделал что-то вроде этого:
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));
Надеюсь, это поможет.
Это поведение на стороне клиента. Я бы порекомендовал использовать JavaScript. Если вы используете JQuery, вы можете сделать это так:
<script type="text/javascript">
$(function(){ $("#SomeText").val("");});
</script>
Я больше не использую Javascript, но я верю в обычный JS, что это похоже на:
document.getElementById("SomeText").value = "";
( Это можно сделать в одном из событий загрузки.
<body onload="...">
Надеюсь, это поможет.
Я вполне уверен, что текстовая область получает значение из Request.Form под капотом, так как ViewData ["SomeText"] пуст.
Возможно ли, что состояние модели было обновлено с ошибкой? Я полагаю, что оно извлечет запрошенное значение из состояния модели, а не из данных представления или модели, если состояние модели недопустимо.
РЕДАКТИРОВАТЬ : Я включаю соответствующий раздел исходного кода из расширения 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);
Делай с. например:
добавить:
ModelState.Clear();
перед оператором return
метода действия кнопок отправки. Работает для меня. Это может сработать для вас.