我在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
....
}
答案 0 :(得分:1)
要在javascript标记中使用ViewData,只需在ViewData前加上@符号
var check = @ViewData["array"]
在您的控制器中
ViewData["array"] = elements;
为什么不将变量设置为模型,因为它看起来像是将它设置为
var check = @Html.Raw(Json.Encode(Model));
然后你可以做任何事情
var blur = check.UserName
答案 1 :(得分:0)
var check = '@ViewData["array"]'
答案 2 :(得分:0)
代码
@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#或@{}
语句。