MVC应用提交后如何返回相同分部视图?
看起来你遇到的核心问题是模型类型不匹配,我们先拆解一下原因:
当你调用return PartialView(reports);而不指定视图名称时,MVC会自动寻找与当前Action同名的视图(也就是你的Report.cshtml主视图)。但这个主视图的模型声明是@model IEnumerable<Ap.Models.Report.Report>,你却传入了单个Report对象,这就触发了错误信息里的类型不匹配问题。
而你用if (Id == "A1")指定分部视图时能正常工作,是因为_PartialA和_PartialB的模型都是单个Report,和你传入的reports对象类型完全匹配。
解决方案:避免默认视图匹配,明确指定分部视图
既然不想用硬编码的if-else来判断,你可以用更灵活的方式动态获取分部视图名称,比如:
1. 用映射字典动态匹配视图
把Session的ID和对应的分部视图名称存在字典里,这样后续新增ID和视图时只需修改字典,不用改判断逻辑:
[HttpPost] public PartialViewResult Report(Report reports) { string Id = Session["ID"].ToString(); Data.DataSQL(reports); ViewModel(reports); //生成下拉列表 // 定义ID与分部视图的映射 var viewMappings = new Dictionary<string, string> { {"A1", "~/Views/_PartialA"}, {"A2", "~/Views/_PartialB"}, // 可以继续添加其他ID对应的视图 }; // 尝试获取匹配的视图名称 if (viewMappings.TryGetValue(Id, out string viewName)) { return PartialView(viewName, reports); } // 如果没有匹配的ID,返回一个默认的分部视图(记得创建这个视图,模型为单个Report) return PartialView("~/Views/_PartialDefault", reports); }
2. 检查主视图模型的合理性
你的主视图Report.cshtml用了IEnumerable<Report>作为模型,但从表单和分部视图的逻辑来看,你是在处理单个Report对象。如果主视图不需要展示多个Report数据,建议把主视图的模型改成单个Report:
@model Ap.Models.Report.Report ..... @using (Html.BeginForm("Report", "Report", FormMethod.Post, new { id = "my" })) { <div id="mpartial"> </div> <button type="submit" id="submit" class="btn btn-primary">Run</button> </div> }
这样即使不小心触发了默认视图匹配,也不会出现模型类型不匹配的问题,但还是推荐第一种方案,明确返回分部视图更符合你的需求。
额外提示
确保所有你返回的分部视图(包括默认的_PartialDefault)的模型声明都是@model Ap.Models.Report.Report,和你传入的reports对象类型一致。
内容的提问来源于stack exchange,提问作者User9895

