将MVC ViewBag中的列表传递给JavaScript

Mat*_*att 11 javascript viewbag asp.net-mvc-4

我有一个用户列表,我使用视图包从控制器传递到我的视图.现在我需要能够将相同的列表传递给页面上的javascript.我可以使用foreach循环重建列表:

    @foreach (var item in ViewBag.userList) //Gets list of users passed from controller and adds markers to the map
{
    var userLat = item.LastLatitude;
    var userLon = item.LastLongitude;
    var _userId = item.Id;

    <script>array.push({"userId":"'@_userId'","userLat":"'@userLat'","userLon":"'@userLon'"});</script>
}
Run Code Online (Sandbox Code Playgroud)

然而,这似乎是一种混乱的方法,如果做出改变则需要进行大量的重新设计.我知道Stack溢出有类似的帖子,但是很多都使用以前版本的MVC,并且相同的语法似乎不适用.有任何想法吗?

Dar*_*rov 21

您可以使用JSON解析器在单个安全的代码行中完成此操作.你绝对不应该像你试图在你的例子中那样用一些字符串连接和东西手动构建JSON.也不需要编写任何循环.

这是正确的方法:

<script type="text/javascript">
    var array = @Html.Raw(
        Json.Encode(
            ((IEnumerable<UserModel>)ViewBag.userList).Select(user => new 
            { 
                userId = user.Id, 
                userLat = user.LastLatitude, 
                userLon = user.LastLongitude 
            })
        )
    );

    alert(array[0].userId);
</script>
Run Code Online (Sandbox Code Playgroud)

生成的HTML看起来与您期望的完全相同:

<script type="text/javascript">
    var array = [{"userId":1,"userLat":10,"userLon":15}, {"userId":2,"userLat":20,"userLon":30}, ...];
    alert(array[0].userId);
</script>
Run Code Online (Sandbox Code Playgroud)

当然,此代码的下一级改进是摆脱ViewCrap并使用强类型视图模型.