如何使用来自 ViewBag 的 JSON 填充 javascript 变量?
Posted
技术标签:
【中文标题】如何使用来自 ViewBag 的 JSON 填充 javascript 变量?【英文标题】:How to populate javascript variable with JSON from ViewBag? 【发布时间】:2014-05-05 05:10:38 【问题描述】:我有这个索引操作:
public ActionResult Index()
var repo = (YammerClient) TempData["Repo"];
var msgCol = repo.GetMessages();
ViewBag.User = repo.GetUserInfo();
return View(msgCol.messages);
GetMessages 返回一个 POCO 消息列表,GetUserInfo 返回一个带有用户信息(id、姓名等)的 POCO。
我想用用户信息的 JSON 表示填充一个 javascript 变量。
所以我想在视图中做这样的事情:
...
<script>
var userInfo = "@ViewBag.User.ToJson()"
</script>
...
我知道这行不通,但有没有办法做到这一点?我想避免为了获取用户信息而在页面加载后执行 ajax 请求。
【问题讨论】:
ASP.NET MVC: How to convert View Model into Json object 的可能重复项 【参考方案1】:在 View 中你可以做这样的事情
@
var jss = new System.Web.Script.Serialization.JavaScriptSerializer();
var userInfoJson = jss.Serialize(ViewBag.User);
在 javascript 中,您可以将其用作
<script>
//use Json.parse to convert string to Json
var userInfo = JSON.parse('@html.Raw(userInfoJson)');
</script>
【讨论】:
是的,完全正确。我不得不使用 JSON.parse,因为它是以字符串形式获取的:var userInfo = JSON.parse('@Html.Raw(userInfoJson)')
你可以跳过服务器端序列化,直接使用var userInfo = JSON.parse('@Html.Raw(Json.Encode(ViewBag.User))');
我认为您不需要将 json 解析为字符串。只需输出var userInfo = @Html.Raw(userInfoJson)
@user3559349 Json.Encode 抛出错误 Unexpected token 但是var model = @Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(model));
对我很有用。【参考方案2】:
正在将此解决方案用于简单对象。但是我在获取 js 对象的数组时遇到了一些问题,所以我将把我所做的留在这里。
C#
@
using Newtonsoft.Json;
ViewBag.AvailableToday = JsonConvert.SerializeObject(list);
js
var availableToday = JSON.parse('@Html.Raw(ViewBag.AvailableToday)');
【讨论】:
嘿,我一直在使用这种方式,但是当我有包含 html 或其他 json 的属性时,我收到此错误“位置 JSON 中的意外令牌 t”我试图解决它。【参考方案3】:客户端代码:
这是对 .Net MVC 控制器的 ajax 调用:
var clientStuff;
$.ajax(
type: 'GET',
url: '@Url.Action("GetStuff", "ControllerName")',
data: ,
dataType: "json",
cache: false,
async: false,
success: function (data)
clientStuff = data;
,
error: function(errorMsg)
alert(errorMsg);
);
服务器端代码:
控制器:
public JsonResult GetStuff()
return Json(_manager.GetStuff(), JsonRequestBehavior.AllowGet);
经理:
public IEnumerable<StuffViewModel> GetStuff()
return _unitofWork.GetStuff();
工作单位:
public IEnumerable<StuffViewModel> GetStuff()
var ds = context.Database.SqlQuery<StuffViewModel>("[dbo].[GetStuff]");
return ds;
工作单元可以是对存储过程的查询(就像我所做的那样)、存储库上下文、linq 等。 我只是为了简单起见在这里调用一个 sproc,尽管可以说简单在于 Entity Framework 和 Linq。
【讨论】:
对我来说这是最优雅的解决方案。请注意,您需要 clientStuff = JSON.parse(data);实际存储对象而不是文本表示。【参考方案4】:你可以改变这一行:
ViewBag.User = repo.GetUserInfo();
到
ViewBag.User = new HtmlString(repo.GetUserInfo());
如果 HtmlString 不可访问,您应该添加 using Microsoft.AspNetCore.Html; 或 using System.Web;。
【讨论】:
感谢阿拉什!这是对我有用的唯一方法。我必须在页面上放置“ld+json”。 我很高兴它对你有帮助@Aviw。随时欢迎您。 顺便说一句,我在 ASP.NET MVC 中使用过它,所以它不仅在 Core 中可用以上是关于如何使用来自 ViewBag 的 JSON 填充 javascript 变量?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用来自不同 ViewController 的 JSON 响应填充 UITableView?
如何使用来自 json 的 mutablearray 填充我的 tableview