如何设置全局视图模型在asp.net Core 3.1?



我是ASP新手。并且在将全局模型和视图模型绑定到剃刀视图时遇到了一些麻烦。我的应用程序是一个混合了Web API和MVC与剃刀视图。

我的目标

当我打开一个ASP。. NET MVC页面,我需要实例化一个模型,通过加载它从数据库(DbContext服务)基于在cookie中收到的id。我想在每个视图或分部视图中全局地使用这个模型对象。

当前实现

我可以访问页面控制器的操作方法中的cookie,因此我必须在每个操作方法中从DbContext加载模型,并将其作为视图模型绑定到目标视图。这是不实际的,因为我必须在每个页面控制器中这样做,因为我需要在导航窗格的所有页面上都使用该模型对象。

<<p>

想法/strong>我认为应该可以在Startup.cs中访问cookie和dbcontext,并将模型对象绑定到_ViewStart。Cshtml,以便在每个视图或分部视图中都可以全局访问。即使这种方法是正确的,我也不知道代码会是什么样子。因为我正在学习web应用程序与。net Core通过边做边学,尝试和错误的时刻。(

我有一个布局页面_Layout.cshtml,其中包括部分视图,如_NavPane.cshtml。我的目标是将一个Model对象传递给_Layout,该_Layout通过从数据库加载实例化(为此我有一个服务IMandantRepository),并依赖于cookie。

每个页面请求都需要该模型对象。这就是为什么在MVC页面控制器之外加载模型对象并将其传递给它们(我在技术上无法实现)将是一个更好的实践。

我试图自己找到一个解决方案,最终以以下临时丑陋的解决方案告终。以下是_ViewStart文件的内容。在底部,我分配了所需的全局变量,我可以在每个视图或部分视图中使用。

这个解决方案至少有两个缺点:

  1. 模型对象可能被冗余加载。
  2. 视图文件中程序逻辑太多
@inject MyProject.Data.IMandantRepository mandantRepo
@{
// Main layout template
Layout = "_Layout";
// Define default values
bool showAdminSection = false;
string src = "/images/logos/nologo.png";
// Read cookie value
string currentMandantUid;
Context.Request.Cookies.TryGetValue("currentMandant", out currentMandantUid);

// Load mandant from the database
var thisMandant = mandantRepo.GetMandantByUid(currentMandantUid);
if(thisMandant is Mandant){
src = "data:image/*;base64," + thisMandant.GetBase64Logo();
showAdminSection = thisMandant.Abbr == "AdminMandant";
}
// Assing global variables to ViewData
ViewData["CurrentMandant"] = thisMandant;
ViewData["logoSrc"] = src;
ViewData["showAdminSection"] = showAdminSection;
}

这是在ConfigureService()中的示例代码Startup.cs。您可以通过这种方式注册您的dbContext类。

services.AddDbContext<BookStoreContext>( options =>
options.UseSqlServer(_configuration.GetConnectionString("DefaultConnection")));

相关内容

  • 没有找到相关文章

最新更新