默认的 MVC 模板使用“@DateTime.Now.Year”来显示版权年份,但我更愿意在任何地方使用 NodaTime。

我目前正在使用 Ninject 将 IClock 的实例注入(inject)到执行时间或日期特定内容的 Controller 中。是否有推荐的方法来访问 MVC 中类似于“DateTime.Now”的“全局 IClock”?我想我可以将 IClock 注入(inject)每个 Controller ,然后将它传递到每个 View ,但有时可以访问全局的东西会很好。

我知道我可以在 Layout 模板中使用 SystemClock.Instance ... 引用一个全局的、可测试的 IClock 会更好。

最佳答案

您可以使用 child action

首先编写一个 Controller ,您可以在其中像往常一样使用依赖注入(inject),并且将包含一个子操作:

public class CopyrightController: Controller
{
    private readonly IClock clock;
    public CopyrightController(IClock clock)
    {
        this.clock = clock;
    }

    [ChildActionOnly]
    public ActionResult Index()
    {
        // In this example I am directly passing the IClock instance
        // to the partial view as model but in a real application
        // you might want to use a view model here
        return PartialView(this.clock);
    }
}

然后你可以有一个相应的部分 View ( ~/Views/Copyright/Index.cshtml ):
@model IClock
<div>Copyright ...</div>

最后在您的 _Layout 中调用此子操作:
<footer>
    @Html.Action("Copyright", "Index")
</footer>

关于asp.net-mvc-4 - 如何将 IClock 注入(inject) MVC4 中的 _Layout?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14946463/

10-10 13:31