问题描述
我在这样的ASP.Net控制器中创建ViewData:
var elements = db.Requests.GroupBy(user => user.submitUser)
.Select(slt => new { UsersCount = slt.Key, CountReq = slt.Count() });
这将例如
UsersCount Count
user1 3
user2 3
user3 3
然后在Javascript中,我想使用UsersCount和Count创建一个数组,例如:
var arrayUsers = ViewData.UsersCount;
var arrayCounter = ViewData.CountReq;
我已经尝试了几种解决方案,但我做不到。 最好的解决方案是什么?
控制器:
public ActionResult Statistics()
{
var elements = db.Requests.GroupBy(user => user.submitUser)
.Select(slt => new { UsersCount = slt.Key, CountReq = slt.Count() });
ViewData["usersCounter"] = elements;
return View();
}
VIEW中的Javascript
<script>
var check = @ViewData["usersCounter"]**;**error
....
}
1楼
要在javascript标签中使用ViewData,只需在ViewData前面加上@符号即可
var check = @ViewData["array"]
在您的控制器中
ViewData["array"] = elements;
为什么不将变量设置为模型,因为看起来就像您将其设置为那样
var check = @Html.Raw(Json.Encode(Model));
那你什么都可以做
var blur = check.UserName
2楼
安德烈你尝试过
var check = '@ViewData["array"]'
3楼
编码
@ViewData["usersCounter"]
将有效地做到这一点:
@ViewData["usersCounter"].ToString()
您正在将viewdata设置为select的结果,因此.ToString
会将通用泛型类型名称直接输出到输出。
只需检查渲染页面的源代码即可查看正在渲染的内容。
另外,指定您得到的“错误”。
如果仅将代码更改为
var check = '@ViewData["array"]'
(根据其他答案),那么“ check”将不包含列表,仅包含list.tostring()
如果要将整个列表复制到js变量中,则需要先对其进行序列化,例如,类似(安装了JSON nuget包):
var check = @(Newtonsoft.Json.JsonConvert.SerializeObject(ViewData["array"]));
需要注意的是:很多人会建议您使用ViewModel而不是ViewData,因为它的类型很严格,因为它通常更易于使用/维护。
但是,您是否有理由在javascript中需要/想要这样做?
即使转换为js之后,GroupBy和Select也不是真正的js,它们更适合使用c#或@{}
语句。