我正在开发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有什么区别?
答案 0 :(得分:35)
模型实际上代表了模型类的实例,而model是lambda表达式的别名。
当您在视图中编写@Model
时,您正在使用从Controller操作传递的ContractViewModel
对象,如果它未从View传递,则它可以为null并且访问Model的任何属性都可以抛出空引用异常并写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
的实例。