如何在.NET中将变量传递给布局?

时间:2016-12-15 13:53:47

标签: asp.net-core asp.net-core-mvc

我的应用有墙壁和笔记。我想把活动墙的布局名称。 怎么做? 我知道在前端我只能使用@Model ...但谁发送这个模型? 更好的想法是将此信息存储在会话变量中还是在用户数据库中创建另一个属性?

编辑:我使用.NET Core 1.1。

2 个答案:

答案 0 :(得分:3)

如果您在谈论_Layout.cshtml,那么您可以将以下内容放入_Layout.cshtml

@RenderSection("layoutName", required: false)

任何继承此布局的视图现在都可以向此部分添加代码。

SomeOtherView.cshtml

@section layoutName{
   <h1>@Model.LayoutName</h1>
}

答案 1 :(得分:2)

  

如何在.NET中将变量传递给布局?

     

我知道在前端我只能使用@Model ......但是谁发送了这个   模型?

模型在控制器/操作中创建,您将其传递给您的操作进行查看:

return View(myModel);


要获得更准确的答案,您需要指定问题或添加您尝试执行的示例代码,但在一般情况下,您可以使用:

  • 模型(ViewModel)
  • ViewBag
  • 的ViewData


请找到更多信息:


此外,View Components是一个有趣的功能,允许您创建UI小部件。


更新

  

在登录后的标准布局中,您可以一直看到例如“hello a @ a”。我希望我的活动墙也能如此。在我更改它或我退出之前,请在我的墙上显示屏幕名称。

出于这个特殊目的,您可以将以下代码直接放入布局/视图文件中:

@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来显示该信息。

  

用户选择墙(只需点击列表中的同一墙),然后该墙的名称应该在布局上,直到用户退出或更改墙。

在这种情况下,JavaScript似乎是一个很好/简单的解决方案?或者您可以在浏览器缓存中读取/存储该信息?

到目前为止,我知道在ASP.NET Core中没有简单的方法来访问会话 - 控制器操作被设计为无状态工作,并且不建议覆盖该行为(阅读文档和SO为什么?)。 / p>

因此,如果不是JavaScript,那么您可以将墙的名称发送回服务器并将其存储在数据库中,接下来您可以通过View Components随时访问它 - 我在我的项目中使用ViewComponents来构建并显示主菜单,对我来说效果很好。

ViewComponent还有一些编码(你需要创建控制器和视图),但它是灵活的功能(我喜欢它),并且很容易在你需要它的地方打电话,只是

@await Component.InvokeAsync("NameOfCOmponent")