0

我正在开发我的第一个 MVC 应用程序,但仍在搞清楚。

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

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

我确认传递给编辑视图的视图模型确实包含所有属性(如我所料)。

问题 - 一旦视图被渲染,视图模型会发生什么?如果我的视图模型包含视图中未使用的属性,它们的值会消失吗?例如,当我单击编辑操作链接以在控制器上触发编辑操作时,传递给操作的视图模型不包含任何属性,除非它们在屏幕上可见。为什么?

顺便说一句,这是 ASP.NET MVC 4 RC。

4

2 回答 2

6

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

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

问题 - 一旦视图被渲染,视图模型会发生什么?

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

如果我的视图模型包含视图中未使用的属性,它们的值会消失吗?

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

例如,当我单击编辑操作链接以在控制器上触发编辑操作时,传递给操作的视图模型不包含任何属性,除非它们在屏幕上可见。为什么?

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

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

于 2012-06-20T15:18:54.567 回答
0

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

HttpPOST如果您使用这些 HTML 帮助程序,请期待您的操作中的值

@Html.TextBoxFor

@Html.DropDownFor

@Html.EditorFor

@Html.HiddenFor

如果您使用这些值,请不要指望这些值

@Html.DisplayFor
于 2012-06-20T15:20:23.223 回答