2

ASP.NET MVC Model Binding est encore nouveau pour moi et j'essaie de comprendre exactement comment cela fonctionne. En ce moment, je semble avoir des problèmes avec une fonctionnalité de Html.Textbox()ASP.NET MVC2 - Problème avec la liaison de modèle et Html.Textbox()

Plus précisément, j'ai une vue où j'ai mis Html.Textbox à une valeur à la fois dans le "Get" et le "Post". Il se règle bien dans le "Get", mais après que l'utilisateur soumet une valeur pendant le "Post", j'ai la classe changer une des valeurs en interne en fonction de l'autre valeur soumise.

(je valider essentiellement une valeur basée sur l'autre ... Je ne sais pas si cela est la bonne façon de le faire ...)

Tracing à travers, je peux voir que la valeur a effectivement changé comme prévu dans le modèle et dans la vue, mais quand il s'affiche sur mon écran après le "Post", la valeur ne s'affiche pas comme il a été changé. Au lieu de cela, c'est ce à quoi il était destiné à l'origine.

Voici mon exemple simplifié:

La vue montre un:

  • déroulant avec des éléments d'un SelectList (pré-sélectionné comme "Autre")
  • une zone de texte en lecture seule (avec une valeur préchargée de 0)
  • bouton Envoyer

l'utilisateur doit choisir une nouvelle valeur de la liste déroulante et cliquez sur soumettre. La méthode "Post" dans le contrôleur récupère la nouvelle valeur dans la liste déroulante et modifie la valeur dans la zone de texte en lecture seule et réaffiche.

(Oui, je vais finalement faire cela avec JQuery, aussi ...)

Voici mon exemple modèle classe:

public class SampleSubmission 
{ 
    public string Name { get; set; } 
    public int Volume { get; set; } 
    public readonly SortedList<string, int> NameVolumeList = new SortedList<string, int>(); 
    // Standard Constructor 
    public SampleSubmission() 
    { 
     NameVolumeList.Add("Sample1", 10); 
     NameVolumeList.Add("Sample2", 20); 
     NameVolumeList.Add("Sample3", 50); 
     NameVolumeList.Add("Other", 0); 
     this.Name = NameVolumeList.Keys[0]; 
     this.Volume = NameVolumeList[Name]; 
    } 
    // Copy Constructor 
    public SampleSubmission(SampleSubmission samSub) : this() 
    { 
     this.Name = samSub.Name; 
     this.Volume = NameVolumeList[Name]; 
    } 
} 

Voici le contrôleur:

public class SampleSubmissionController : Controller 
{ 
    [AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult Index() 
    { 
     SampleSubmission sampleSub = new SampleSubmission(); 
     return View(sampleSub); 
    } 

    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Index(SampleSubmission sampleSub) 
    { 
     SampleSubmission samSub = new SampleSubmission(sampleSub); 
     return View(samSub); 
    } 
} 

Voici la vue:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" 
Inherits="System.Web.Mvc.ViewPage<MvcModelBindTest.Models.SampleSubmission>" %> 

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 
<% using (Html.BeginForm()) { %> 
<%= Html.DropDownList("Name", new SelectList(Model.NameVolumeList.Keys.ToList())) %> 
<%= Html.TextBox("Volume",Model.Volume) %> 
<input type="submit" name="pick" id="pick" value="Pick" /> <% } %> 
</asp:Content> 

Des idées sur pourquoi la nouvelle valeur ne s'affiche pas?

EDIT:

Pour résoudre le problème, je lis le lien donné par « jfar » et a fait un changement de 1 ligne.

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Index(SampleSubmission sampleSub) 
    { 
     SampleSubmission samSub = new SampleSubmission(sampleSub); 
     // Reset Model Value 
     ModelState.SetModelValue("Volume", new ValueProviderResult(
      samSub.Volume, "", System.Globalization.CultureInfo.CurrentCulture)); 
     return View(samSub); 
    } 

Cela fonctionne définitivement. Malheureusement, cela ressemble à un hack grossier pour moi. Et si je devais mettre à jour les valeurs de plusieurs champs? Il doit y avoir une meilleure (plus simple?) Façon de le faire.

EDIT2: Trouvé ma réponse. Voir ci-dessous...

+0

double possible [Comment effacer les zones de texte définies avec des aides MVC HTML] (http://stackoverflow.com/ questions/3444994/comment-effacer-textboxes-defined-with-mvc-html-helpers) – jfar

Répondre

1

J'ai trouvé la réponse à ma propre question lorsque je suis tombé sur une autre variable qui devait être réinitialisée. Comme je regardais la structure de données, j'ai réalisé ce que je voulais était l'état vierge où il n'y avait pas de clés dans le ModelState.

 ModelState.Remove(key); 

Où "clé" est la valeur que vous essayez de réinitialiser.

1

De: How to clear textboxes defined with MVC HTML helpers

« premier regard du HtmlHelper au ModelState et ViewData pour voir si vous fournissez les

des valeurs qui correspondent à leur clé, puis utiliser enfin quelle que soit la valeur Si. vous devez réinitialiser la valeur de la zone de texte, vous devez également effacer l'entrée ModelState avec la clé correspondante . Une autre alternative est redirection à la même page à la place de simplement rendre une vue via javascript ou avec MVC.

+1

probablement il veut montrer de nouvelles valeurs au lieu de l'effacer. – TheVillageIdiot

+0

Oui, de nouvelles valeurs - c'est exactement ce que je veux faire. J'ai lu le lien et les réponses que l'utilisateur "Cynthia" a donné. J'ai corrigé le problème et l'ai noté ci-dessus, mais je n'aime pas comment cela se passe. On se sent comme un hack. – Pretzel

+0

@TheVillageIdiot, c'est vrai, le concept est le même. @Pretzel vous profitez probablement de cette fonctionnalité lors de la préservation de l'état. C'est assez facile d'écrire vos propres aides HTML aussi. Assez sûr qu'il existe des bibliothèques que vous pourriez google aussi. – jfar

0

Une autre solution simple au lieu de

<%= Html.TextBox("Volume",Model.Volume) %> 

utiliser la balise HTML entrée

<input id="Volume" name ="Volume" value="@Model.Volume" /> 
Questions connexes