2013-10-24 2 views
2

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

 [HttpGet] 
     public ActionResult Index() 
     { 
      UserAndTableViewmodel Viewmodel = new UserAndTableViewmodel(); 
      Viewmodel.T = Deserialize(); 
      Viewmodel.U = new User(); 

      for (int i = 0; i < Viewmodel.T.Questions.Count(); i++) 
      { 
       Viewmodel.U.UserChoices.Add(new Choice(Viewmodel.T.Questions[i].Choices[0].Value)); 
      } 

      return View(Viewmodel); 
     } 

     [HttpPost] 
     public ActionResult Index(UserAndTableViewmodel Viewmodel) 
     { 
      // Viewmodel.T = Deserialize(); 

      if (ModelState.IsValid) 
      { 
       return View("Thanks", Viewmodel); 
      } 
      else 
      { 
       return View(Viewmodel); 
      } 
     } 

XML-код это как следует:

<Table> 
    <Question Content="Question one"> 
    <Choice Value="Answer 1" /> 
    <Choice Value="Answer 2" /> 
    </Question> 
    <Question Content="Question two"> 
    (...) 
    </Question> 
</Table> 

Я проходящее deserialised данные в "Index" вид, где пользователь может выберите его ответы. Затем данные отправляются в [HttpPost], и я хочу, чтобы он отображал представление, где записывается каждый вопрос с его ответом, но возникает проблема - Viewmodel.T равно нулю. Что я должен делать, что я не должен снова десериализовать его?

+0

Если вы не имеете поле в View делает вашу собственность его ViewModel.T не будет отправлен в метод HttpPost. – bump

+0

Как это достичь? – blisher

+0

см. Ответ ниже – bump

ответ

3

Вы не хотите сериализовать или десериализовать в MVC4. Просто передайте свои данные в виде объекта модели представления, который будет доступен в вашем представлении.

2

Вы могли бы оказать скрытое поле для вашей собственности, например, так:

Вид:

@model Namespace.UserAndTableViewmodel 

@using(Html.BeginForm()){ 
    @Html.HiddenFor(m => m.T) 
    ... 
} 

Теперь вы должны иметь значение в вашем методе HttpPost. В принципе, если значение не отображается в вашем представлении, оно не будет отправлено в метод HttpPost. Ваша модель просмотра не поддерживает значения между округлыми переходами между представлением и контроллером. Вот почему вам также нужно повторно заполнить модель представления в HttpPost, прежде чем снова вернуться к ней. У него нет значений, которые вы установили в HttpGet.

(используйте только скрытые поля для данных, которые не должны быть защищены, хотя. Вы можете также использовать @Html.TextBoxFor или @Html.LabelFor)

+0

Спасибо большое, попробуем это – blisher

+0

@Marek Пожалуйста, отметьте ответ как принятый, если он работает, поэтому другие могут видеть, что он ответил. – bump

+0

OK Я могу использовать Html.HiddenFor(), но как установить его по состоянию фактического свойства Model.T? – blisher

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