2013-06-13 4 views
1

Je suis très nouveau sur ASP.NET MVC et j'ai des problèmes avec quelque chose qui semble ne pas poser problème.Les valeurs des modèles ne sont pas conservées

Avec cette ViewModel:

public enum Step 
{ 
    One = 1, 
    Two = 2, 
    Three = 3 
} 

public class TestViewModel 
{ 
    public string Description 
    { 
     get 
     { 
      return "Current step is " + this.Step; 
     } 
    } 

    public Step Step { get; set; } 
    public string Dummy{ get; set; } 

    public TestViewModel() 
    { } 

    public TestViewModel(Step step) 
    { 
     this.Step = step; 
    } 
} 

et ce point de vue:

@using MvcApplication1 
@model TestViewModel 

@using (Html.BeginForm("Test", "Home")) 
{ 
    if (Model.Step == Step.One) 
    { 
    @Html.HiddenFor(m => m.Step) 
    @Html.HiddenFor(m => m.Dummy) 
    <p>@Model.Description</p> 
    } 
    else if (Model.Step == Step.Two) 
    { 
    @Html.HiddenFor(m => m.Step) 
    @Html.HiddenFor(m => m.Dummy) 
    <p>@Model.Description</p> 
    } 
    else if (Model.Step == Step.Three) 
    { 
    @Html.HiddenFor(m => m.Step) 
    @Html.HiddenFor(m => m.Dummy) 
    <p>@Model.Description</p> 
    } 
    <input type="submit" value="Continue" /> 
} 

et ce contrôleur:

public ActionResult Test() 
{ 
    TestViewModel model = new TestViewModel(Step.One); 
    return View(model); 
} 

[HttpPost] 
public ActionResult Test(TestViewModel model) 
{ 
    Debug.Print("Enter: Step = {0}", model.Step); 

    switch (model.Step) 
    { 
     case Step.One: 
      model.Step = Step.Two; 
        model.Dummy = "2"; 
      break; 
     case Step.Two: 
      model.Step = Step.Three; 
        model.Dummy = "3"; 
      break; 
     case Step.Three: 
      model.Step = Step.One; 
        model.Dummy = "1"; 
      break; 
    } 

    Debug.Print("Enter: Step = {0}", model.Step); 

    return View(model); 
} 

Sur le premier clic du bouton du contrôleur définit model.Step à Step.Two et ma vue est mise à jour correctement.

Mais sur le second (et tout autre) clic du modèle de bouton. Step est lu comme Step.One au lieu de Step.Two donc rien n'est mis à jour sur ma vue.

Y at-il quelque chose d'évident que je suis manquant ici? Pourquoi les valeurs ne sont-elles pas lues/sauvegardées correctement?

Répondre

2

Vous n'avez pas besoin d'autres blocs dans votre vue. Vous faites fondamentalement la même chose. Cela fonctionnera également:

@using (Html.BeginForm("Test", "Home")) 
{ 
    @Html.HiddenFor(m => m.Step) 
    <p>@Model.Description</p> 

    <input type="submit" value="Continue" /> 
} 

Après avoir posté le formulaire, vous retournez une vue dans la même action. ASP.NET MVC utilise uniquement les valeurs de la requête POST dans les aides HTML, en ignorant les valeurs mises à jour dans votre action. Vous pouvez le voir en HTML après avoir fait la première demande et voici the reason why it's implemented that way.

Je suggère de mettre en œuvre Post-Redirect-Get pattern. Après avoir mis à jour la valeur, faites une redirection vers une autre action.

[HttpPost] 
public ActionResult Test(TestViewModel model) 
{ 
    Debug.Print("Enter: Step = {0}", model.Step); 

    switch (model.Step) 
    { 
     case Step.One: 
      model.Step = Step.Two; 
      break; 
     case Step.Two: 
      model.Step = Step.Three; 
      break; 
     case Step.Three: 
      model.Step = Step.One; 
      break; 
    } 

    Debug.Print("Enter: Step = {0}", model.Step); 

    return RedirectToAction("SomeAction", model); 
} 

Ceci sérialisera le modèle en chaîne de requête. Le meilleur moyen serait de passer un identifiant en tant que paramètre.

+0

Merci Ufuk. Cela semble faire le travail. – dlarkin77

Questions connexes