2013-10-24 118 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数据为“指数”的观点,在这里用户可以选择他的答案。然后数据发布到[HttpPost],我希望它呈现一个视图,其中每个问题的答案都被写入,但是会发生问题 - Viewmodel.T等于null。我该怎么做,我不应该再次反序列化它?

+0

如果没有一个字段在视图渲染你的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

好吧,我可以使用Html.HiddenFor(),但如何设置它的实际Model.T属性的状态? – blisher