Réinitialiser la valeur du textarea après la soumission du formulaire
- Je veux envoyer un message à userID=3 par aller /MyController/Message/3
- Cela exécute Message() [get], de l'action, j'ai entrez du texte dans la zone de texte et cliquez sur Enregistrer pour poster le formulaire
- Message() [post] action enregistre les modifications, réinitialise la valeur de SomeText à la chaîne vide et retourne à l'affichage.
À ce point, j'attends la zone de texte vide parce que j'ai mis ViewData["SomeText"] à la chaîne.Vide
Pourquoi la zone de texte valeur non actualisée à la chaîne vide après le post d'action?
Ici sont les actions:
[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();
}
Et la vue correspondante:
<%@ 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>
Vous devez vous connecter pour publier un commentaire.
Le problème est le HtmlHelper récupération de la ModelState valeur, qui est rempli avec les données publiées. Plutôt que de piratage au long de ce par la réinitialisation de la ModelState, pourquoi ne pas rediriger les requêtes vers le [get] l'action. [La poste] action pourrait également définir un statut temporaire message comme ceci:
Cela me semble plus correct de comportement.
ModelState
même après le poster et à l'aide deRedirectToAction("save", new{ id = 0});
à la fin de laSave(MyModel vm)
? Que puis-je faire pour réinitialiser le formulaire, après validation, à l'exception d'ModelState.Clear()
?UpdateTargetId
deAjax.BeginForm
a été fourni avec le mauvaisId
.Le problème, c'est que votre ModelState est re-rempli avec les valeurs envoyées.
Ce que vous pouvez faire est clair sur l'Action qui a le Poste d'attribut :
Le code html helpers lire la valeur de la ModelState. Et il n'y a pas de manière élégante pour remplacer ce comportement.
Mais si vous ajoutez cette ligne après
SaveToDB(ID, SomeText)
, cela devrait fonctionner :J'ai tout essayé, mais n'a travaillé que quand je faisais quelque chose comme ceci:
Espère que cette aide.
ReturnViewModel
? Quelle méthode est-ce?Au lieu d'utiliser ModelState.Clear() qui efface l'ensemble de la modelstate, vous pouvez le faire ModelState.Supprimer("SomeText"), si vous le souhaitez. Ou rendre l'Entrée sans la htmlhelper-extensions.
Ils sont conçus pour prendre la Valeur de ModelState au lieu du Modèle (ou viewdata).
Qui est un client de comportement. Je recommande l'utilisation de javascript. Si vous utilisez JQuery, vous pouvez le faire comme ceci:
Je n'utilise pas de Javascript, mais je crois que dans l'ordinaire JS que c'est comme:
(Vous pouvez le faire sur l'un des événements de chargement.
Espère que cette aide.
Je suis assez certain que le textarea est en saisissant la valeur de la Demande.Sous le capot depuis ViewData["SomeText"] est vide.
Est-il possible que le modèle de l'état a été mis à jour avec un message d'erreur? Je crois qu'il va tirer de la tentative de valeur à partir du modèle de l'état plutôt que d'afficher les données ou le modèle si le modèle de l'état n'est pas valide.
MODIFIER:
Je suis, y compris la section pertinente de la le code source de la TextArea HtmlHelper extension ci-dessous. Il me semble que c'est exactement ce que j'attendais -- s'il y a eu une erreur de modèle, elle tire la valeur à partir du modèle de l'état, sinon il utilise de ViewData. Notez que dans votre méthode Post les "SomeText" clé ne devrait même pas exister jusqu'à ce que vous la définissez, c'est à dire, il ne sera pas reporté de la version du code qui répond à l'OBTENIR.
Puisque vous fournissez une valeur à la ViewData,
useViewData
doit être fausse,attemptedValue
doit être fausse, à moins qu'une erreur a été définie dans le modèle de l'état.Ne s.th. comme ceci:
ajouter:
avant la
return
déclaration de la soumettre les boutons d'action de la méthode. Fonctionne pour moi. Il pourrait travailler pour vous.