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

下拉关闭时如何重新加载含更新Model的Partial View

解决下拉菜单关闭后刷新Partial View的问题

看起来你现在的核心问题是Ajax更新Model后,无法正确刷新Partial View并传递新的Model数据。我帮你梳理下问题所在,然后给出具体的修复步骤:

问题分析

  1. 你的UpdateView方法现在返回的是Index(),这会返回整个Index视图,而不是你需要的Partial View;而且用TempData传递Model在Ajax场景下不太可靠——因为Ajax请求和后续的load请求是两个独立的HTTP请求,TempData的数据可能已经被清空了。
  2. 前端Ajax的success回调里,$("#partial").html(result);里的result根本没定义,而且$("#Dashboard").load("/Home/_Home");没有传递任何参数,所以_Home Action无法拿到你更新后的ProductionLine信息。
  3. 你提到无法调用public ActionResult _Home(Model model),大概率是因为这个Action的参数接收方式不对,或者没有正确传递参数。

修复步骤

1. 修改控制器的UpdateView方法,直接返回Partial View和更新后的Model

把UpdateView改成直接返回_Home Partial View,而不是跳转到Index:

[HttpPost]
public ActionResult UpdateView(string selectProductionLine)
{
    if(selectProductionLine == null)
    {
        selectProductionLine = _productionLineService.Collection().FirstOrDefault().Id;
    }
    var serializer = new JavaScriptSerializer();
    dynamic jsondata = serializer.Deserialize(selectProductionLine, typeof(string));
    DisplayViewModel dvm = new DisplayViewModel();
    ProductionLine pl = _productionLineService.Find(jsondata);
    dvm.ProdLine = new ProductionLineViewModel {
        Id = pl.Id,
        CreatedAt = pl.CreatedAt,
        Name = pl.Name,
        ActiveLine = pl.ActiveLine,
        ComputerName = pl.ComputerName,
        UPE = pl.UPE
    };
    // 直接返回Partial View和构造好的dvm
    return PartialView("_Home", dvm);
}

2. 修正前端Ajax代码,用返回的Partial View内容替换目标容器

现在你不需要再额外调用load方法,直接在Ajax的success回调里用返回的HTML替换#Dashboard的内容:

function OnClose() {
    var chart = $("#safetyIncident-chart").data("kendoChart");
    var chart2 = $("#qualityError-chart").data("kendoChart");
    chart.dataSource.read();
    chart2.dataSource.read();
    
    var selectProductionLine = $("#productionLine-dropdown").data("kendoDropDownList").value();
    $.ajax({
        url: '@Url.Action("UpdateView", "Home")',
        type: 'post',
        dataType: "html", // 注意这里改成html,因为返回的是Partial View的HTML
        data: { "selectProductionLine": selectProductionLine }, // 不需要JSON.stringify,直接传值就行
        success: function (response) {
            // 用返回的Partial View HTML替换Dashboard容器
            $("#Dashboard").html(response);
        },
        error: function(xhr, status, error) {
            // 可以加个错误处理,方便调试
            console.error("刷新Partial View失败:", error);
        }
    });
}

这里注意两个点:

  • dataType改成html,因为控制器返回的是Partial View的HTML内容,不是JSON
  • 不需要对selectProductionLine做JSON.stringify,直接传递原始值即可,后端的UpdateView方法能直接接收字符串参数

3. 确保_Home.cshtml能正确接收DisplayViewModel

检查你的_Home Partial View顶部是否声明了正确的Model类型:

@model YourNamespace.DisplayViewModel

这样Partial View才能正确渲染你传递的新Model数据。

备选方案:如果需要单独调用_Home Action

如果你更倾向于通过load方法调用_Home Action,那需要:

  1. 给_Home Action添加HttpGet支持,并接收ProductionLine的Id参数:
[HttpGet]
public ActionResult _Home(string productionLineId)
{
    DisplayViewModel dvm = new DisplayViewModel();
    // 根据productionLineId获取对应的ProductionLine数据,构造dvm
    ProductionLine pl = _productionLineService.Find(productionLineId);
    dvm.ProdLine = new ProductionLineViewModel {
        Id = pl.Id,
        CreatedAt = pl.CreatedAt,
        Name = pl.Name,
        ActiveLine = pl.ActiveLine,
        ComputerName = pl.ComputerName,
        UPE = pl.UPE
    };
    return PartialView(dvm);
}
  1. 修改前端的Ajax回调,用load传递参数:
success: function () {
    var productionLineId = $("#productionLine-dropdown").data("kendoDropDownList").value();
    $("#Dashboard").load("@Url.Action("_Home", "Home")", { productionLineId: productionLineId });
}

这样就能确保_Home Action拿到正确的参数,返回带新数据的Partial View了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:22:28