【问题标题】:Why do my viewmodel properties end up null or zero?为什么我的视图模型属性最终为空或零?
【发布时间】:2012-06-20 15:15:47
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

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

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

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

    它超出范围,符合垃圾收集条件。

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      @Html.TextBoxFor
      
      @Html.DropDownFor
      
      @Html.EditorFor
      
      @Html.HiddenFor
      

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

      @Html.DisplayFor
      

      【讨论】:

      • 我使用了@Html.TextBoxFor(m=>m.FirstName) 和@Html.TextBoxFor(m=>m.LastName),但它们在提交时都返回为空。它们完美地填充了我从数据库中获取的数据,例如,名字文本框显示“John”,姓氏文本框显示“Doe”。为什么我在提交时没有得到这些值?它们是空的。有趣的是,声明为 @Html.HiddenFor(m=>m.EmployeeId) 的隐藏字段确实会返回预填充的值。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-14
      • 2016-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-13
      • 1970-01-01
      相关资源
      最近更新 更多