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

ASP.NET MVC/C#:如何在非所属控制器视图中加载另一控制器的局部视图数据

解决跨控制器加载局部视图的模型不匹配问题

你的错误根源很明确:当你直接调用@Html.Partial时,如果不指定模型参数,它会默认把当前主视图的模型(也就是List<Systex.Models.tblCategory>)传递给局部视图,但你的Horizontal1.cshtml需要的是Systex.Models.tblAdvertisement类型的模型,类型不匹配就抛出了这个异常。

下面给你两种可行的解决方案,推荐第一种,更符合MVC的设计原则:

方案一:使用@Html.Action调用目标控制器的Action获取数据

这种方法会让AdvertisementController负责自己的数据获取逻辑,保持职责分离,是更规范的做法:

  1. 在AdvertisementController中添加获取广告数据的Action
    先在你的AdvertisementController里新增一个Action,专门用来获取并返回广告局部视图:

    public ActionResult GetHorizontalAd()
    {
        // 根据你的业务需求从tblAdvertisement表获取数据,比如取第一条符合条件的广告
        var advertisement = db.tblAdvertisement.FirstOrDefault();
        // 返回指定的局部视图,并传入正确的模型
        return PartialView("Horizontal1", advertisement);
    }
    
  2. 在BlogsCategory.cshtml中调用这个Action
    把原来的@Html.Partial替换成@Html.Action,让它触发上面的Action获取数据:

    @model List<Systex.Models.tblCategory>
    <!-- 调用AdvertisementController的GetHorizontalAd Action -->
    @Html.Action("GetHorizontalAd", "Advertisement")
    

    这样执行时,会先调用AdvertisementController的GetHorizontalAd方法获取广告数据,再用正确的模型渲染Horizontal1.cshtml,完美解决类型不匹配的问题。

方案二:通过ViewBag/ViewData传递模型(适合简单场景)

如果不想新增Action,也可以在CategoryController的Action里提前获取广告数据,通过ViewBag传递给局部视图:

  1. 在CategoryController的Action中获取广告数据
    修改你返回BlogsCategory.cshtml的Action,添加广告数据到ViewBag:

    public ActionResult BlogsCategory()
    {
        // 原来获取分类列表的逻辑
        var categoryList = db.tblCategory.ToList();
        
        // 获取广告数据并存入ViewBag
        var adData = db.tblAdvertisement.FirstOrDefault();
        ViewBag.HorizontalAd = adData;
        
        return View(categoryList);
    }
    
  2. 修改局部视图调用代码
    在BlogsCategory.cshtml里调用Partial时,手动传入ViewBag中的模型:

    @model List<Systex.Models.tblCategory>
    <!-- 手动传递ViewBag中的广告模型给局部视图 -->
    @Html.Partial("~/Views/Advertisement/Horizontal1.cshtml", ViewBag.HorizontalAd)
    

    这样局部视图就能拿到正确类型的模型,不会再报错。

总结

优先推荐方案一,因为它让每个控制器专注于自己的业务逻辑,代码结构更清晰,也方便后续维护广告相关的功能。方案二更适合简单的临时场景,但会让CategoryController承担不属于它的数据获取职责,长期来看不利于代码维护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 13:13:13