在控制器和视图之间传递数据 - ASP.NET MVC 4

本文关键字:ASP NET MVC 数据 控制器 视图 之间 | 更新日期: 2023-09-27 18:36:47

我正在做一个简单的调查,学习 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。我应该怎么做,我不应该再次反序列化它?

在控制器和视图之间传递数据 - ASP.NET MVC 4

您不想在 MVC4 中进行任何序列化或反序列化。只需将数据作为视图模型对象传递,即可在视图中使用。

您可以为属性呈现一个隐藏字段,如下所示:

视图:

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

现在,您的 HttpPost 方法中应该有一个值。基本上,如果一个值没有在你的视图中呈现,它就不会发布到 HttpPost 方法。视图模型在视图和控制器之间的往返之间不保留值。这就是为什么您还需要在 HttpPost 中重新填充视图模型,然后再将其返回到视图。它没有您在 HttpGet 中设置的值。

(仅对不需要保护的数据使用隐藏字段。您也可以使用 @Html.TextBoxFor@Html.LabelFor