如何从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的方式,保证类型安全,步骤如下:
- 创建包含两个模型的组合ViewModel
public class RoutePlanWithHeaderViewModel { // 原RoutePlan页面的模型 public RoutePlanModel RoutePlan { get; set; } = null!; // AdminHeader需要的数据集 public List<AdminHeaderModel> AdminHeaders { get; set; } = new List<AdminHeaderModel>(); }
- 在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); }
- 修改RoutePlan.cshtml的模型声明
@model RoutePlanWithHeaderViewModel
- 在RoutePlan视图中引用AdminHeader部分视图时传递数据
<!-- 假设AdminHeader是部分视图,命名为_AdminHeader.cshtml --> <partial name="_AdminHeader" model="Model.AdminHeaders" />
- 确认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的数据源逻辑,或者需要异步更新,可以创建独立控制器:
- 创建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); } }
- 在RoutePlan.cshtml中调用该控制器方法加载视图
@Html.Action("LoadHeaderDropdown", "AdminHeader")
如果需要页面加载后动态更新下拉框,可使用AJAX:
// 页面加载完成后请求数据并渲染 $(function() { $.get("/AdminHeader/LoadHeaderDropdown", function(html) { // 替换下拉框容器内容 $("#header-dropdown-container").html(html); }); });
内容的提问来源于stack exchange,提问作者user616076
相关产品推荐
相关产品推荐

