当前位置: 代码迷 >> JavaScript >> 在Javascript代码中使用ViewData
  详细解决方案

在Javascript代码中使用ViewData

热度:51   发布时间:2023-06-13 11:47:17.0

我在这样的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

....

}

要在javascript标签中使用ViewData,只需在ViewData前面加上@符号即可

var check = @ViewData["array"]

在您的控制器中

ViewData["array"] = elements;

为什么不将变量设置为模型,因为看起来就像您将其设置为那样

var check = @Html.Raw(Json.Encode(Model));

那你什么都可以做

var blur = check.UserName

安德烈你尝试过

var check = '@ViewData["array"]'

编码

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

  相关解决方案