在Javascript代码

时间:2015-07-17 23:36:58

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

我在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

....

}

3 个答案:

答案 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#或@{}语句。