我有这个索引动作:
public ActionResult Index()
{
var repo = (YammerClient) TempData["Repo"];
var msgCol = repo.GetMessages();
ViewBag.User = repo.GetUserInfo();
return View(msgCol.messages);
}
GetMessages返回POCO消息列表,GetUserInfo返回一个POCO,其中包含用户信息(id,name等)。
我想用用户信息的JSON表示填充javascript变量。
所以我想在视图中做这样的事情:
...
<script>
var userInfo = "@ViewBag.User.ToJson()"
</script>
...
我知道这不起作用,但是有办法吗?我想避免在加载页面后为了获取用户信息而不得不执行ajax请求。
答案 0 :(得分:41)
在视图中,你可以做这样的事情
@{
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>
答案 1 :(得分:6)
将此解决方案用于简单对象。但是我在将数组转换为js对象时遇到了一些问题,所以我只想离开我在这里做的事情。
C#
@{
using Newtonsoft.Json;
ViewBag.AvailableToday = JsonConvert.SerializeObject(list);
}
JS
var availableToday = JSON.parse('@Html.Raw(ViewBag.AvailableToday)');
答案 2 :(得分:2)
客户端代码:
这是对.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;
}
工作单元可以是对sproc的查询(正如我所做的),存储库上下文,linq等。 我只是为了简单而在这里调用一个sproc,尽管可以认为简单性在于Entity Framework和Linq。
答案 3 :(得分:1)
您可以更改此行:
ViewBag.User = repo.GetUserInfo();
收件人
ViewBag.User = new HtmlString(repo.GetUserInfo());
您应该使用Microsoft.AspNetCore.Html添加; ;如果无法访问HtmlString,则使用System.Web添加。