【问题标题】:mvc uppercase Model vs lowercase modelmvc 大写模型与小写模型
【发布时间】:2014-06-11 05:07:06
【问题描述】:

我正在开发一个 MVC 5 项目,对 MVC 来说非常陌生。我注意到代码中的这一行:

@Html.DropDownListFor(model => model.ContractorId, Model.Contractors)

页面顶部的指令是:

@model Project.Models.ContractViewModel

ContractViewModel 类中确实有一个 Contractors 对象。

public IEnumerable<SelectListItem> Contractors

我只是对大写M(Model.Contractors)有点困惑,Model是否总是引用@model中传递的对象?那么使用 Model.Contractors 和 model.Contractors 有什么区别呢?

【问题讨论】:

  • 第一行仅使用模型作为 lambda 表达式。 @Html.DropDownListFor(m =&gt; m.ContractorId, Model.Contractors) 甚至@Html.DropDownListFor(myself =&gt; myself.ContractorId, Model.Contractors) 也是正确的。

标签: asp.net asp.net-mvc asp.net-mvc-3 asp.net-mvc-4


【解决方案1】:

Model 实际上代表了您的 model 类的一个实例,而 model 是 lambda 表达式的别名。

当您在视图中写入@Model 时,您使用的是从控制器操作传递的ContractViewModel 的对象,如果它不是从视图传递的,它可以为空并且访问模型的任何属性都可以抛出 空引用异常和写Model.Contractors你基本上是指ContractViewModel.Contractors

当你写一个 html 助手时你需要为它写一个别名,它不是必须写model 你可以写任何东西。

例如:

@Html.DropDownListFor(m=> m.ContractorId, Model.Contractors)

它只是访问Html Helper内部模型属性的别名。

当您在 View 的顶部写 @model Project.Models.ContractViewModel 时,情况就不同了,在这种情况下,我们正在定义视图模型,它将采用 Project.Models.ContractViewModel 的实例,实际上我们的视图现在被强类型化为实例类Project.Models.ContractViewModel。

【讨论】:

    猜你喜欢
    • 2013-11-02
    • 2017-06-26
    • 2014-08-08
    • 2015-10-10
    • 2020-03-03
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    • 2021-10-14
    相关资源
    最近更新 更多