如何使用来自 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

如何使用来自 Alamofire 的 JSON 数据填充 tableview?

MVC中利用ViewBag传递Json数据时的前端处理方法

如何使用 angularjs 填充 json 数据?

如何根据 sencha 中 json 响应的第一个组合值填充第二个组合