会当该方法是通过ASP.NET MVC打电话给我的ViewModel PARAM永远在下列情况下空? 例如使用URL“... /首页/索引”。
public ViewResult Index(HomeViewModel viewModel)
{
// .. do stuff...viewModel is never null here when called within ASP.NET?
}
我从来没有注意到之前ASP.NET MVC但视图模型这种行为(如果它不被提供)似乎被越来越实例化。
可能有人澄清这种行为。
是的,你总是会得到一个视图模型的实例,偶虽然没有任何参数存在可分配给视图模型的要求。
为什么出现这种情况?
这是怎么DefaultModelBinder
工作,
创建视图模型的实例。
迭代模型的属性和要求值提供商找到值并设置发现值的属性。
返回创建的实例。
如果你看到的步骤DefaultModelBinder
它不关心,如果存在这样可以设置为模型实例,它只是提前启动并创建实例,然后填充性能要求的任何值。
这没有什么意义吗?
这将是更加复杂的模型绑定来检查是否含有匹配模型的属性,然后创建一个实例的任何值的请求。
MVC将尝试采取了通过POST发送的值/ GET和“自动地”绑定他们的模型的属性。 这是通过默认的模型粘合剂完成。 在大多数情况下,默认的模型绑定会做你需要的一切。
你可以更深入的定制模型绑定(和可能得到的是一个更深入的了解),但展望IModelBinder接口 - 它包含一个名为BindModel一个方法。 在这种方法中,你会非常需要无论是在ControllerContext.HttpContext.Request和你的类属性填写(基本上是一回事默认的模型粘合剂一样)。 使用自定义的模型绑定有几个篮球,你需要通过跳跃,但会给你绑定生命周期的理念。
答案很简单:在默认模式粘结剂,它不会是空。
HTH
当动作方法的参数是一个复杂的类型,那么类DefaultModelBinder使用反射以获取该组的公共属性,然后结合到它们中的每。 对于复杂类型,它使用Activator.CreateInstance(typeToCreate);
然后ValueProviders将被用于获得这些属性的值。 请记住,模型粘合剂没有锁定特定人士,但他们可以从源聚集建造对象。