下拉关闭时如何重新加载含更新Model的Partial View
解决下拉菜单关闭后刷新Partial View的问题
看起来你现在的核心问题是Ajax更新Model后,无法正确刷新Partial View并传递新的Model数据。我帮你梳理下问题所在,然后给出具体的修复步骤:
问题分析
- 你的
UpdateView方法现在返回的是Index(),这会返回整个Index视图,而不是你需要的Partial View;而且用TempData传递Model在Ajax场景下不太可靠——因为Ajax请求和后续的load请求是两个独立的HTTP请求,TempData的数据可能已经被清空了。 - 前端Ajax的
success回调里,$("#partial").html(result);里的result根本没定义,而且$("#Dashboard").load("/Home/_Home");没有传递任何参数,所以_HomeAction无法拿到你更新后的ProductionLine信息。 - 你提到无法调用
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,那需要:
- 给
_HomeAction添加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); }
- 修改前端的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
相关产品推荐
相关产品推荐

