如何将返回JsonResult的Controller中ViewBag值传入Razor视图隐藏字段
问题根源
返回JsonResult的Controller方法不会触发Razor视图的渲染流程,ViewBag的赋值无法传递到视图——因为JsonResult是直接输出JSON响应,跳过了视图绑定、ViewBag传递的环节,所以视图里读取@ViewBag.CanUserEdit自然是空值。
解决方案
根据你的业务场景选择对应方案:
方案1:改用ViewResult返回视图(适合需要渲染页面+传递状态的场景)
如果你的需求是展示页面同时传递状态值,将Action的返回类型改为ViewResult,正常赋值ViewBag:
public ActionResult Person() { ViewBag.CanUserEdit = true; ViewBag.AllowLink = false; // 业务数据可存入ViewBag或ViewModel ViewBag.PersonInfo = new { Name = "张三", Age = 30 }; return View(); }
在Razor视图中添加隐藏字段:
<input type="hidden" id="CanUserEdit" value="@ViewBag.CanUserEdit" /> <input type="hidden" id="AllowLink" value="@ViewBag.AllowLink" />
外部JS文件中获取值:
// 注意布尔值在HTML中会被转为字符串,需要转成布尔类型 const canUserEdit = document.getElementById('CanUserEdit').value === 'True'; const allowLink = document.getElementById('AllowLink').value === 'True';
方案2:将状态值并入JSON返回(适合AJAX请求场景)
如果必须用JsonResult返回数据,直接把状态字段和业务数据合并到返回的JSON对象中:
public JsonResult Person() { var personData = new { Name = "张三", Age = 30 }; var response = new { Data = personData, CanUserEdit = true, AllowLink = false }; return Json(response, JsonRequestBehavior.AllowGet); }
前端AJAX请求成功后,手动创建隐藏字段存储状态值:
$.ajax({ url: '/你的控制器名/Person', type: 'GET', success: function(res) { // 创建CanUserEdit隐藏字段 const canEditInput = document.createElement('input'); canEditInput.type = 'hidden'; canEditInput.id = 'CanUserEdit'; canEditInput.value = res.CanUserEdit; document.body.appendChild(canEditInput); // 创建AllowLink隐藏字段 const allowLinkInput = document.createElement('input'); allowLinkInput.type = 'hidden'; allowLinkInput.id = 'AllowLink'; allowLinkInput.value = res.AllowLink; document.body.appendChild(allowLinkInput); // 处理业务数据 console.log(res.Data); } });
方案3:用TempData临时存储(仅限特定场景,不推荐)
如果一定要在返回JsonResult后让视图拿到值,可使用TempData(依赖Session,且值读取一次后会被清除):
public JsonResult Person() { TempData["CanUserEdit"] = true; TempData["AllowLink"] = false; return Json(new { Name = "张三" }, JsonRequestBehavior.AllowGet); }
视图中读取TempData并生成隐藏字段:
<input type="hidden" id="CanUserEdit" value="@TempData["CanUserEdit"]" /> <input type="hidden" id="AllowLink" value="@TempData["AllowLink"]" />
内容的提问来源于stack exchange,提问作者M-Fulu
相关产品推荐
相关产品推荐

