我正在使用带有Razor语法的MVC3,并在Apress书“Pro ASP.Net MVC 3 Framework”(这是非常好的)中进行了示例。在其中,作者在_Layout.cshtml文件中有这个位:
<body>
<div id="header">
@{Html.RenderAction("Summary", "Cart");}
<div class="title">SPORTS STORE</div>
</div>
<div id="categories">
@{ Html.RenderAction("Menu", "Nav"); }
</div>
<div id="content">
@RenderBody()
</div>
</body>
我的问题与CartController类有关。我看到它在构造函数中传递了一个Cart对象,但上面的_Layout.cshtml代码段中的代码在调用RenderAction()
时似乎没有传递给它?
CartController片段:
public ViewResult Summary(Cart cart) {
return View(cart);
}
当我调试该方法时,Cart对象实际上是传入的,但是我看不到它来自哪里。此示例代码使用Ninject作为依赖注入容器,但我在配置中找不到任何有关Cart类的知识的证据。 MVC中是否存在“默认值”机制?
答案 0 :(得分:4)
Summary
是一个操作方法。它不是构造函数。因此,DI与此无关。相反,我们看到的是默认模型绑定器的行为。也就是说,模型绑定器将分析您为action方法声明的任何参数,并尝试使用从表单或查询字符串参数和路由值派生的数据填充这些参数。
在您的特定场景中,由于您没有将任何路由值传递给Html.Action
调用,所以它所做的只是实例化Cart
类 - 如果您检查它,您可能会看到它是为空(没有设置任何属性)。
但是,如果您要将路由值传递到Action
调用中,它将填充该对象。例如,如果Cart
包含类型为int的名为“Size”的属性,并且您的操作调用如下所示:
@Html.Action("Summary", "Cart", new { Size = 5 })
您的Cart
类现在将Size
属性设置为5.
(另请注意,在这种情况下使用Action
方法而不是RenderAction
方法要清晰得多。正如您所见,RenderAction
假设语句级调用,这需要那些丑陋的括号花括号。另一方面,Action
是一个表达式,返回内联的实际HTML内容,因此可以用更简洁的方式表达。)
答案 1 :(得分:1)
Summary
实际上是一个动作方法,而不是构造函数。数据可以来自许多不同的地方: