wake-up-neo.com

Setzen Sie den Wert des Textbereichs nach dem Senden des Formulars zurück

  1. Ich möchte eine Nachricht an userID = 3 senden, indem Sie zu/MyController/Message/3 gehen
  2. Dies führt die Aktion Message () [get] aus. Ich gebe Text in den Textbereich ein und klicke auf Speichern, um das Formular zu veröffentlichen
  3. Message () [post] -Aktion speichert die Änderungen, setzt den Wert von SomeText auf leere Zeichenfolge zurück und kehrt zur Ansicht zurück.

An dieser Stelle erwarte ich, dass der Textbereich leer ist, da ich ViewData ["SomeText"] auf string.Empty gesetzt habe

Warum wird der Textbereichswert nach der Aktion nicht in eine leere Zeichenfolge aktualisiert?

Hier sind die Aktionen:

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

Und die entsprechende Ansicht:

<%@ 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>
28
xraminx

Das Problem ist, dass der HtmlHelper den ModelState-Wert abruft, der mit den gebuchten Daten gefüllt ist. Anstatt dies durch Zurücksetzen des ModelState zu umgehen, sollten Sie zur Aktion [get] zurückkehren. Die [post] -Aktion kann auch eine temporäre Statusmeldung wie folgt setzen:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Message(int ID, string SomeText)
{
  // save Text to database
  SaveToDB(ID, SomeText);

  TempData["message"] = "Message sent";
  return RedirectToAction("Message");
}

Dies scheint mir mehr richtiges Verhalten.

39
roryf

Das Problem ist, dass Ihr ModelState erneut mit den gebuchten Werten gefüllt wird.

Was Sie tun können, ist die Aktion mit dem Post-Attribut zu löschen:

ModelState.Clear();
68
Olivier Payen

Die HTML-Helfer lesen den Wert aus dem ModelState. Es gibt keine elegante Möglichkeit, dieses Verhalten außer Kraft zu setzen.

Wenn Sie diese Zeile nach SaveToDB(ID, SomeText) hinzufügen, sollte dies funktionieren:

ModelState["SomeText"].Value = 
    new ValueProviderResult("", "", CultureInfo.CurrentCulture);
7
Çağdaş Tekin

Anstatt ModelState.Clear () zu verwenden, um den gesamten Modelstate zu löschen, können Sie ModelState.Remove ("SomeText") ausführen, wenn Sie möchten. Oder rendern Sie die Eingabe ohne die HTML-Helper-Erweiterungen. Sie sind so konzipiert, dass sie den Wert von ModelState anstelle des Modells (oder der Ansichtsdaten) übernehmen.

1
Kirsten

Ich habe alles versucht, aber nur gearbeitet, wenn ich so etwas gemacht habe:

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

Hoffe das hilft.

1
MalachiteBR

Do s.th. so was:

hinzufügen:

ModelState.Clear();

vor der return-Anweisung der Aktionsmethode Submit-Buttons. Funktioniert bei mir. Es könnte für Sie arbeiten. 

0
user6243946

Ist es möglich, dass der Modellstatus mit einem Fehler aktualisiert wurde? Ich glaube, dass es den versuchten Wert aus dem Modellstatus zieht und nicht aus Ansichtsdaten oder dem Modell, wenn der Modellstatus nicht gültig ist.

EDIT: Ich füge den relevanten Abschnitt des source code aus der Erweiterung TextArea HtmlHelper hinzu. Es scheint mir, dass es genau das tut, was ich erwartet habe. Wenn ein Modellfehler aufgetreten ist, wird der Wert aus dem Modellstatus gezogen, andernfalls wird er von ViewData verwendet. Beachten Sie, dass in Ihrer Post-Methode der Schlüssel "SomeText" erst dann vorhanden sein sollte, wenn Sie ihn festgelegt haben, d. H. Er wird nicht von der Version des Codes übernommen, der auf das GET reagiert.

Da Sie den ViewData explizit einen Wert angeben, sollte useViewData false sein, attemptedValue sollte false sein, es sei denn, es wurde ein Fehler im Modellstatus festgelegt.

    // 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

Das ist ein clientseitiges Verhalten. Ich würde Javascript empfehlen. Wenn Sie JQuery verwenden, können Sie dies folgendermaßen tun:

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

Ich benutze kein Javascript mehr, aber ich glaube an normale JS, dass es so ist:

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

(Sie würden dies bei einem der Ladeereignisse tun. 

<body onload="...">

Hoffe das hilft.

0
Jeff Ancel

Ich bin ziemlich sicher, dass der Textbereich den Wert aus der Request.Form unter der Haube bezieht, da ViewData ["SomeText"] leer ist.

0
Mike Geise