2012-07-02 4 views
2

Je viens de sortir des formulaires Web ASP.NET et est maintenant un débutant MVC. J'ai lu que MVC ne gère pas ViewState contrairement à ASP.NET Web Forms. Je me demandais comment vous pouvez atteindre la persistance des données.Postback Les données ne sont pas conservées

Je possède ce formulaire simple avec un modèle fortement typé:

class MyModel 
{ 
    public string TextboxData { get; set; } 
    public string HiddenData { get; set; } 
} 

Avec la forme suivante:

@using (Html.BeginForm()) 
{ 
    @Html.TextBoxFor(m => m.TextboxData) 
    @Html.HiddenFor(m => m.HiddenData) 
} 

Mon contrôleur est simple. Il traite simplement les données dans le modèle et le transmet de retour à la vue:

[HttpPost] 
public ActionResult PerformAction(MyModel mv) 
{ 
    mv.DoSomething(); 
    return View(mv);   
} 

Comme le contrôleur réutilise tout le modèle, suis-je raison de supposer que toutes les données saisies par le précédent envoyées sont conservés à la prochaine rafraîchir?

En fait, celui pour TextBoxData a été conservé (après la publication, la zone de texte contient toujours les données entrées) mais celle pour HiddenData n'a pas été conservée. Est-ce que je fais quelque chose de mal ici?

+0

est la variable mv.HiddenData dans le contrôleur rempli avec les données lorsque vous faites une publication?Sinon, les données ne seront bien sûr pas envoyées à la vue. Et oui, vous avez raison lorsque le mv contient du contenu pour les deux propriétés, elles doivent apparaître dans la vue. Je suppose que vous entrez les données pour le champ caché dans le HttpGet (puisque vous ne pouvez pas l'entrer dans le champ caché dans le formulaire ..) – Michel

Répondre

2

Semble que vous faites des choses correctes, il devrait également envoyer des données de texte cachées lorsqu'il est publié sur le serveur.

Semble Id pour champ masqué est dupliqué ou non valide. S'il vous plaît se référer

Razor MVC model is losing data on Save action

ASP.Net MVC Hidden field not working as expected

espère que ces messages peuvent résoudre votre problème.

+0

Il semble qu'un autre plugin tiers utilisait le même ID que j'utilisais, donc le navigateur est devenu confus. Merci pour les heads up – Devmonster

1

Sur un POST modèle est automagiquement rempli

Vous voyez une explication de la façon dont fonctionne la liaison du modèle sur this dotnetslackers article

maintenant à votre problème -. En regardant le code affiché dans la question, il semble que vous le fais bien. Pour comprendre le problème ici est ce que vous devriez faire 1. Voir la source de votre page. 2. Vérifiez si le champ caché est rendu avec une valeur (quelle que soit la valeur que vous attendez)

Si le champ caché rendu est pas encore défini avec la valeur que vous attendez de voir, cela signifie probablement que le get, quand le modèle a été créé, "m.HiddenData" n'a pas été défini avec les valeurs appropriées.

Espérons que cela aide !!

+0

Je l'ai eu. Il semble qu'un autre élément a été nommé le même ID que j'utilisais. Le navigateur était confus je suppose. – Devmonster

2

Si à l'intérieur du mv.DoSomething(); vous modifiez la valeur des propriétés TextboxData ou HiddenData, ces modifications ne seront pas reflétées lorsque vous affichez la vue. La raison en est que les assistants HTML tels que TextBoxFor et HiddenFor regardent d'abord à l'intérieur du ModelState lors de la liaison, puis dans le modèle. C'est par conception.

Donc, si vous devez modifier les valeurs affichées à l'origine dans une action POST, vous devez les supprimer de la ModelState première:

[HttpPost] 
public ActionResult PerformAction(MyModel mv) 
{ 
    // we intend to modify the values => we must remove them from ModelState 
    // or the HTML helpers will reuse the old values 
    ModelState.Remove("TextboxData"); 
    ModelState.Remove("HiddenData"); 

    mv.TextboxData = "some new value"; 
    mv.HiddenData = "some new hidden value"; 

    return View(mv);   
} 
+0

Je n'ai pas réellement modifié les valeurs de publication dans DoSomething. Mais au moins, je sais maintenant si vous devez supprimer ces valeurs dans MOdelState. Merci – Devmonster

+0

+1 Cette information est très utile, merci de nous éclairer. –

Questions connexes