我正在开发我的第一个MVC应用程序,仍在全力以赴。
我有一个viewmodel,此时,它与我的域对象相同。我的控制器构建了viewmodel并将其传递给视图。该视图仅显示一些属性,因为我不希望为用户显示主键和/或外键,在主键的情况下,我需要拥有数据才能更新/删除数据库。
看来,除非我在视图中使用viewmodel属性,否则当我将viewmodel传回时,它将设置为默认值(0表示数值类型,null表示引用类型)。这是正确的行为吗?
我确认传递给Edit视图的viewmodel确实包含了所有属性(正如我所料)。
问题 - 呈现视图后,viewmodel会发生什么?如果我的viewmodel包含视图中未使用的属性,它们的值是否会消失?例如,当我单击Edit actionlink以在控制器上触发Edit操作时,传递给该操作的viewmodel不包含任何属性,除非它们在屏幕上可见。为什么呢?
BTW,这是ASP.NET MVC 4 RC。
答案 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