2013-06-13 2 views
1

Я очень новичок в ASP.NET MVC, и у меня возникают проблемы с чем-то, что похоже на то, что это должно быть без проблем.Значения модели не сохраняются

С этой 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; 
    } 
} 

и этой точкой зрения:

@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" /> 
} 

и этот контроллер:

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

На первом нажатием кнопки контроллер устанавливает model.Step к Шагу. Два и мое представление обновлено правильно.

Но на втором (и любом последующем) нажатии кнопки model.Step читается как Step.One вместо Step.Too, так что ничего не обновляется на моем представлении.

Есть ли что-то очевидное, что я здесь отсутствует? Почему значения не читаются/сохраняются правильно?

ответ

2

Вам не нужно, если на вашем месте блокирует блокировка. Вы в основном делаете то же самое. Это также будет работать:

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

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

После размещения формы вы возвращаете представление в том же самом действии. ASP.NET MVC использует только значения из запроса POST в HTML-хелперах, игнорируя обновленные значения в вашем действии. Вы можете увидеть его в HTML после того, как сделаете первый запрос, и вот the reason why it's implemented that way.

Я бы предложил осуществить Post-Redirect-Get pattern. После обновления значения сделайте перенаправление для другого действия.

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

Это сериализует модель в строке запроса. Лучше всего было бы передать некоторый ID в качестве параметра.

+0

Спасибо Ufuk. Кажется, это делает работу. – dlarkin77

Смежные вопросы