【问题标题】:How to populate javascript variable with JSON from ViewBag?如何使用来自 ViewBag 的 JSON 填充 javascript 变量?
【发布时间】: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 请求。

【问题讨论】:

标签: javascript asp.net asp.net-mvc json viewbag


【解决方案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 中可用
猜你喜欢
  • 1970-01-01
  • 2014-07-15
  • 2014-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
相关资源
最近更新 更多