一个视图中的多个模型 ASP.net core mvc

问题描述 投票:0回答:1

美好的一天。我在开发asp.net core mvc应用程序时遇到了问题。 事实上,我有一个仪表板页面,其数据取自@model DashboardPageViewModel。另外,在每个页面上我都有一个导航栏组件,其中有一个用户昵称,该昵称也取自@model UserViewModel。 但系统每页只允许上传一个模型。告诉我如何解决这个问题

我尝试在课堂上结合使用模型,但它们来自太不同的领域。导航栏出现在每个页面上。

c# asp.net-mvc asp.net-core model-view-controller view
1个回答
0
投票

1.一种快速方法是您可以创建一个新的 ViewModel,它结合了

DashboardPageViewMode
l 和
UserViewModel
的属性。

型号

public class DashboardViewModel
{
    public DashboardPageViewModel DashboardData { get; set; }
    public UserViewModel UserData { get; set; }
}

然后使用

Partial View
/
View Component
重用该组件。

查看

@model DashboardViewModel
   
<header>
    @Html.Partial("_Navbar", Model.UserData)
</header>    
<!-- Access DashboardPageViewModel properties -->
<h2>@Model.DashboardData.Title</h2>

2.如果用户相关数据在多个页面中是通用的,您可以从服务中检索它。创建一个提供用户相关数据(例如用户昵称)的服务,并将该服务注入到您的仪表板页面和导航栏组件中。这样,两个组件都可以独立访问必要的数据。

服务

public interface IUserService
{
    string GetUserNickname();
}

public class UserService : IUserService
{
    public string GetUserNickname()
    {
        // Logic to retrieve user nickname from database or elsewhere
        //just for easy demo sharing
        return "User123";
    }
}

程序.cs

builder.Services.AddScoped<IUserService, UserService>();

将服务注入部分视图/视图组件

@inject IUserService UserService
@{
    var userNickname = UserService.GetUserNickname();
}

<div>
    <span>Welcome, @userNickname!</span>
    <!-- Other Navbar content -->
</div>

3.尽管不建议在复杂场景中使用,但您可以使用

ViewData
ViewBag
将附加数据从控制器/Razor 页面传递到视图。然而,这种方法可能会导致代码的可维护性较差,因此应谨慎使用。

© www.soinside.com 2019 - 2024. All rights reserved.