将视图模型PARAM永远不会在ASP.NET MVC 3行动无效?(Will ViewModel p

2019-06-26 11:49发布

会当该方法是通过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但视图模型这种行为(如果它不被提供)似乎被越来越实例化。

可能有人澄清这种行为。

Answer 1:

是的,你总是会得到一个视图模型的实例,偶虽然没有任何参数存在可分配给视图模型的要求。

为什么出现这种情况?

这是怎么DefaultModelBinder工作,

  1. 创建视图模型的实例。

  2. 迭代模型的属性和要求值提供商找到值并设置发现值的属性。

  3. 返回创建的实例。

如果你看到的步骤DefaultModelBinder它不关心,如果存在这样可以设置为模型实例,它只是提前启动并创建实例,然后填充性能要求的任何值。

这没有什么意义吗?

这将是更加复杂的模型绑定来检查是否含有匹配模型的属性,然后创建一个实例的任何值的请求。



Answer 2:

MVC将尝试采取了通过POST发送的值/ GET和“自动地”绑定他们的模型的属性。 这是通过默认的模型粘合剂完成。 在大多数情况下,默认的模型绑定会做你需要的一切。

你可以更深入的定制模型绑定(和可能得到的是一个更深入的了解),但展望IModelBinder接口 - 它包含一个名为BindModel一个方法。 在这种方法中,你会非常需要无论是在ControllerContext.HttpContext.Request和你的类属性填写(基本上是一回事默认的模型粘合剂一样)。 使用自定义的模型绑定有几个篮球,你需要通过跳跃,但会给你绑定生命周期的理念。

答案很简单:在默认模式粘结剂,它不会是空。

HTH



Answer 3:

当动作方法的参数是一个复杂的类型,那么类DefaultModelBinder使用反射以获取该组的公共属性,然后结合到它们中的每。 对于复杂类型,它使用Activator.CreateInstance(typeToCreate); 然后ValueProviders将被用于获得这些属性的值。 请记住,模型粘合剂没有锁定特定人士,但他们可以从源聚集建造对象。



文章来源: Will ViewModel param never be null in ASP.NET MVC 3 action?