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

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

На этом этапе я ожидаю, что текстовая область будет пустой, потому что я установил ViewData [“SomeText”] в string.Empty

Почему значение текстовой области не обновляется до пустой строки после отправки сообщения?

Вот действия:

[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(); } 

И соответствующий взгляд:

          

Проблема заключается в том, что 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(); //This will clear the address that was submited viewModel.Address = new Address(); viewModel.Message = "Dados salvos com sucesso!"; return View("Addresses", ReturnViewModel(viewModel)); 

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

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

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

  

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

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

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

  

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

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

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

EDIT : Я включаю соответствующий раздел исходного кода из расширения TextArea HtmlHelper ниже. Мне кажется, что он делает именно то, что я ожидал – если была ошибка модели, она вытягивает значение из состояния модели, иначе оно использует его из ViewData. Обратите внимание, что в вашем методе Post ключ «SomeText» не должен существовать до его установки, т. Е. Он не переносится с версии кода, который отвечает на GET.

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

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

Давайте будем гением компьютера.