在一个全新的基本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?
答案 0 :(得分:4)
即使请求中没有提供参数,您也永远不会获得空视图模型,因为默认模型绑定器的工作原理如下:
因此,一旦您的控制器操作被命中,视图模型将永远不会为空。
答案 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在动作方法中与参数无关。