我正在进行一项简单的调查,以学习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>
我将反序列化数据传递到“索引”视图,用户可以在其中选择答案。然后数据发布到[HttpPost]并且我希望它呈现一个视图,其中每个问题及其答案都被写入,但是出现问题 - Viewmodel.T
等于null。我应该做什么,我不应该再次反序化它?
答案 0 :(得分:3)
您不希望在MVC 4中进行任何序列化或反序列化。只需将您的数据作为视图模型对象传递,该对象将在您的视图中可用。
答案 1 :(得分:2)
您可以为您的媒体资源渲染隐藏字段,如下所示:
查看:
@model Namespace.UserAndTableViewmodel
@using(Html.BeginForm()){
@Html.HiddenFor(m => m.T)
...
}
现在你应该在你的HttpPost方法中有一个值。基本上,如果您的视图中未呈现值,则不会将其发布到HttpPost方法。您的视图模型不会保留视图和控制器之间的往返之间的值。 这就是为什么您还需要在HttpPost中重新填充视图模型,然后再将其返回到视图中。它没有您在HttpGet中设置的值。
(仅对隐藏字段使用不需要保护的数据。您也可以使用@Html.TextBoxFor
或@Html.LabelFor
)