1

我正在使用带有 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 中是否有“默认值”机制?

4

2 回答 2

4

Summary是一种动作方法。它不是构造函数。因此,DI 与此无关。相反,我们看到的是默认模型绑定器的行为。也就是说,模型绑定器将分析您为操作方法声明的任何参数,并尝试使用从表单或查询字符串参数和路由值派生的数据填充这些参数。

在您的特定场景中,由于您没有将任何路由值传递给您的Html.Action调用,因此它所做的只是实例化Cart该类——如果您检查它,您可能会看到它是空的(没有设置任何属性)。

但是,如果您要将路由值传递到您的Action调用中,它将填充该对象。例如,如果Cart包含一个名为“Size”的 int 类型的属性,并且您的操作调用如下所示:

@Html.Action("Summary", "Cart", new { Size = 5 })

您的Cart类现在将其Size属性设置为 5。

(另请注意,在这种情况下使用Action方法而不是RenderAction方法要干净得多。正如您所看到的,RenderAction假设一个语句级调用,这需要那些丑陋的封闭花括号。 Action另一方面是一个表达式并返回实际的 HTML 内容内联,因此可以以更简洁的方式表达。)

于 2011-12-21T21:45:19.013 回答
1

Summary实际上是一个动作方法,而不是构造函数。数据可能来自许多不同的地方:

  • 路由参数
  • 请求参数
  • 表单变量
  • 等等。
于 2011-12-21T21:46:56.803 回答