Asp.net MVC 如何向 _layout.cshtml 传递数据?

6

我经常读到使用ViewModel是从控制器向视图传递数据的MVC方式,但是如何将数据传递给_Layout.cshtml,例如页面标题、元描述、文章作者等等...

这种类型的数据应该如何通过MVC方式传递?我只需要使用ViewBag吗?


可能是将数据传递到所有页面共同使用的布局的重复问题。 - DavidG
2
你可以使用 ViewBag 来设置页面标题。你也可以将其作为模型属性并将 Layout.cshtml 文件绑定到该视图模型。你还可以使用会话数据。在这里,你有很多选择。 - mituw16
ViewBag是最简单的。但你也可以使用Child Action - Jasen
@TheDude 你是在问MVC 5还是MVC Core? - Lukasz Mk
1个回答

7
您有几种方法:
- ViewBag - ViewData - View Components - Injections(以下是示例)
ViewBag和ViewData非常容易使用,但并不总是方便的。
有一个很大的优点-您可以在视图的一个位置设置/读取它们,并在另一个位置读取/显示它们-例如,您可以在主视图中设置它们,在_lauout.cshtml中读取/显示它们。
View Components是MVC Core中最有趣的新功能(我认为),它允许您创建UI小部件。
ViewComponent需要写更多代码(您需要创建控制器和视图),但它是一项灵活的功能(我喜欢它),并且很容易在需要它的地方调用,只需使用@await Component.InvokeAsync("NameOfCOmponent")。


注入不是我喜欢的,但有时很有用 - 比如,如果您想显示用户名,您可以直接将以下代码放入您的布局/视图文件中:

@using System.Security.Claims
@using Microsoft.AspNetCore.Identity
@inject UserManager<ApplicationUser> userManager
@{
    var userInfo = ((await userManager?.GetUserAsync(User))?.xxx);
    // where 'xxx' is any property of ApplicationUser model
}

然后您可以在同一视图中使用@userInfo来显示该信息。


更多信息:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接