为什么我的viewmodel属性最终为null或为零?

时间:2012-06-20 15:15:47

标签: asp.net-mvc

我正在开发我的第一个MVC应用程序,仍在全力以赴。

我有一个viewmodel,此时,它与我的域对象相同。我的控制器构建了viewmodel并将其传递给视图。该视图仅显示一些属性,因为我不希望为用户显示主键和/或外键,在主键的情况下,我需要拥有数据才能更新/删除数据库。

看来,除非我在视图中使用viewmodel属性,否则当我将viewmodel传回时,它将设置为默认值(0表示数值类型,null表示引用类型)。这是正确的行为吗?

我确认传递给Edit视图的viewmodel确实包含了所有属性(正如我所料)。

问题 - 呈现视图后,viewmodel会发生什么?如果我的viewmodel包含视图中未使用的属性,它们的值是否会消失?例如,当我单击Edit actionlink以在控制器上触发Edit操作时,传递给该操作的viewmodel不包含任何属性,除非它们在屏幕上可见。为什么呢?

BTW,这是ASP.NET MVC 4 RC。

2 个答案:

答案 0 :(得分:6)

  

看来,除非我在视图中使用viewmodel属性,否则它是   设置为默认值(0表示数值类型,null表示   当我传回viewmodel时,引用类型)。它是否正确   行为?

是的,当您调用控制器操作时,您需要传递要在请求中绑定的所有属性。因此,例如,如果您使用html <form>来调用操作,则需要使用输入字段。您可以使用隐藏字段,但它们必须存在,否则不会向控制器操作发送任何内容

  

问题 - 呈现视图后,viewmodel会发生什么?

它超出范围,有资格收集垃圾。

  

如果我的viewmodel包含未在视图中使用的属性,那么它们的值是否会消失?

绝对。但即使您在视图中使用这些属性,它们也会消失。例如,如果您只在视图中显示值,但在提交表单时不使用输入字段将它们发送回服务器,那么它们也会消失。

  

例如,当我单击编辑动作链接以激活编辑动作时   在控制器上,传递给操作的viewmodel执行   不包含任何属性,除非它们在屏幕上可见。为什么呢?

因为视图模型不再存在。它消失了,垃圾收集了。这就是HTTP协议的工作原理。这是无国籍的。请求之间没有任何内容。您必须在请求中包含要填充的任何属性,如POST表单值或查询字符串参数(如果使用操作链接或其他任何内容)。

如果用户不应该在视图中修改这些值,那么您可以简单地将id传递给控制器​​操作,这将允许此控制器操作从存储的任何地方(数据库或其他)使用它来检索模型这个id。

答案 1 :(得分:0)

如果您的属性采用任何帮助方法在表单中生成input HTML element,那么在您提交表单时,它将在您的HTTPost操作方法中提供。如果您只是在div / span中显示它,它将不会获得属性值。这就是MVC模型绑定的工作原理。

如果您使用这些HTML帮助

,则期望HttpPOST操作中的值
@Html.TextBoxFor

@Html.DropDownFor

@Html.EditorFor

@Html.HiddenFor

如果您使用这些

,请不要指望这些值
@Html.DisplayFor