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>
Ответы
Ответ 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
метода действия кнопок отправки. Работает на меня. Это может сработать для вас.