为什么我期望的null对象不为null?

时间:2015-02-14 18:12:10

标签: c# asp.net-mvc

在一个全新的基本mvc应用程序中,假设我有一个ViewModel类:

public class ViewModel
{
     public string someProp { get; set; }
}

这是我的简化控制器:

public class HomeController : Controller
{
    public ActionResult Index(ViewModel vm = null)
    {
        if (vm == null)
        {
            //Some Debugging Code
        }
        return View();
    }
}

我运行我的项目(访问https:localhost:{port}/Home)并使用Visual Studio中的即时窗口视图检查索引Action中的vm值。

令我惊讶的是,我发现vm == null会返回false。 我怀疑该值为null,因为它是默认值。

有谁能告诉我我错过了什么?

具有null proprety的对象是不是被视为null?

3 个答案:

答案 0 :(得分:4)

即使请求中没有提供参数,您也永远不会获得空视图模型,因为默认模型绑定器的工作原理如下:

  1. 实例化模型
  2. 运行视图模型的所有属性,并查询值提供程序以从请求
  3. 设置这些属性的值
  4. 返回已填充的实例
  5. 因此,一旦您的控制器操作被命中,视图模型将永远不会为空。

答案 1 :(得分:1)

这就是模型绑定器的工作原理。

它尝试创建一个实例,然后设置从不同来源获取值的属性。它还检查数据注释属性强加的约束,并相应地设置ModelState.IsValid属性帐户。

答案 2 :(得分:0)

在参数中传递值不会覆盖调用Index(ViewModel)时传递的参数。

编译MVC项目时,它会自动实例化操作方法中的所有参数(使用System.Reflection)。我不确定,但使用类似Activator.CreateInstance的方法。它只有在找到合适的构造函数时才有效。这就是为什么如果你在ViewModel中创建一个带有参数的构造函数会导致错误的原因,因为它无法找到默认构造函数来实现ViewModel对象。

为什么会这样? https:localhost:{port}/Home/{id} => ActionResult Index(int id) {...}

编辑 ViewModel在动作方法中与参数无关。