我有此索引操作:
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,名称等)。
我想用用户信息的JSON表示填充javascript变量。
所以我想在视图中做这样的事情:
...
<script>
var userInfo = "@ViewBag.User.ToJson()"
</script>
...
我知道那行不通,但是有办法吗?我希望避免在页面加载后仅为了获取用户信息而进行ajax请求。
在视图中,您可以执行类似的操作
@{
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>
将这种解决方案用于简单对象。但是我在将数组传递给js对象时遇到了一些问题,因此我将在此留下我所做的一切。
C#
@{
using Newtonsoft.Json;
ViewBag.AvailableToday = JsonConvert.SerializeObject(list);
}
js
var availableToday = JSON.parse('@Html.Raw(ViewBag.AvailableToday)');
客户端代码:
这是对.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);
}
});
服务器端代码:
CONTROLLER:
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。
在ASP.Net Core中,您可以更改此行:
ViewBag.User = repo.GetUserInfo();
收件人
ViewBag.User = new HtmlString(repo.GetUserInfo());
如果无法访问HtmlString,则应添加使用Microsoft.AspNetCore.Html;。