You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从RoutePlanController更新共享视图AdminHeader.cshtml的模型数据

问题描述

我在共享视图AdminHeader.cshtml中添加了一个下拉框,需要从数据库表获取数据进行动态更新。当使用RoutePlan.cshtml视图时,是通过RoutePlanController加载对应的RoutePlanModel。现在困惑:是否需要为AdminHeader.cshtml单独创建控制器?或者如何在RoutePlanController中同时加载AdminHeaderModel,以此更新AdminHeaderModel.cs及对应的AdminHeader.cshtml?

AdminHeader模型代码

public class AdminHeaderModel
{
    public string UserId { get; set; } = null!;
    public string Domain { get; set; } = null!;
    public string Link_Type { get; set; } = null!;
    public string Icon { get; set; } = null!;
}

AdminHeader.cshtml加载下拉框的代码

@foreach (AdminHeaderModel hdr in Model)
{
    <div class="dropdown-item light-box-container account selected" rel=".com" data-id=@hdr.DataId>
       <div class="account-info">
          <img src=@hdr.Icon>
          <span class="account-name">@hdr.Domain</span>
       </div>
       <div class="account-actions">
          @if (hdr.Link_Type == "0")
          {
               <div class="account-status pass">Connected</div>
               <div class="account-select"><i class="fas fa-check-circle"></i></div>
          }
          else
          {
               <div class="account-status warn"><i class="fas fa-exclamation"></i>Connect</div>
               <div class="account-select"><i class="far fa-check-circle"></i></div>
          }
       </div>                
    </div> 
 }   

(注:代码中hdr.DataId在AdminHeaderModel中未定义,需检查是否遗漏属性或笔误)

解决方案

方案一:在RoutePlanController中同时加载AdminHeaderModel(最简方式)

推荐使用组合ViewModel的方式,保证类型安全,步骤如下:

  1. 创建包含两个模型的组合ViewModel
public class RoutePlanWithHeaderViewModel
{
    // 原RoutePlan页面的模型
    public RoutePlanModel RoutePlan { get; set; } = null!;
    // AdminHeader需要的数据集
    public List<AdminHeaderModel> AdminHeaders { get; set; } = new List<AdminHeaderModel>();
}
  1. 在RoutePlanController的Action中同时获取两类数据并赋值给ViewModel
public IActionResult Index()
{
    // 从服务/数据库获取RoutePlan数据
    var routePlanData = _routePlanRepository.GetRoutePlan();
    // 从服务/数据库获取AdminHeader数据
    var adminHeaderData = _adminHeaderRepository.GetAdminHeaders();

    var viewModel = new RoutePlanWithHeaderViewModel
    {
        RoutePlan = routePlanData,
        AdminHeaders = adminHeaderData
    };

    return View(viewModel);
}
  1. 修改RoutePlan.cshtml的模型声明
@model RoutePlanWithHeaderViewModel
  1. 在RoutePlan视图中引用AdminHeader部分视图时传递数据
<!-- 假设AdminHeader是部分视图,命名为_AdminHeader.cshtml -->
<partial name="_AdminHeader" model="Model.AdminHeaders" />
  1. 确认AdminHeader.cshtml的模型声明
@model List<AdminHeaderModel>

如果不想创建组合ViewModel,也可以用ViewBag临时传递数据(不推荐,无类型检查):

  • 在Controller中:
ViewBag.AdminHeaders = _adminHeaderRepository.GetAdminHeaders();
  • 在AdminHeader.cshtml中:
@{
    var adminHeaders = ViewBag.AdminHeaders as List<AdminHeaderModel>;
}
@foreach (var hdr in adminHeaders)
{
    // 原下拉框渲染代码
}

方案二:创建独立的AdminHeaderController

如果需要在多个页面复用AdminHeader的数据源逻辑,或者需要异步更新,可以创建独立控制器:

  1. 创建AdminHeaderController
public class AdminHeaderController : Controller
{
    private readonly IAdminHeaderRepository _adminHeaderRepo;

    // 依赖注入数据访问服务
    public AdminHeaderController(IAdminHeaderRepository adminHeaderRepo)
    {
        _adminHeaderRepo = adminHeaderRepo;
    }

    // 返回AdminHeader的部分视图
    public IPartialViewResult LoadHeaderDropdown()
    {
        var headerData = _adminHeaderRepo.GetAdminHeaders();
        return PartialView("_AdminHeader", headerData);
    }
}
  1. 在RoutePlan.cshtml中调用该控制器方法加载视图
@Html.Action("LoadHeaderDropdown", "AdminHeader")

如果需要页面加载后动态更新下拉框,可使用AJAX:

// 页面加载完成后请求数据并渲染
$(function() {
    $.get("/AdminHeader/LoadHeaderDropdown", function(html) {
        // 替换下拉框容器内容
        $("#header-dropdown-container").html(html);
    });
});

内容的提问来源于stack exchange,提问作者user616076

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 10:52:17