MVC将模型数据传递到JavaScript

时间:2018-08-22 11:57:35

标签: javascript c# jquery razor model-view-controller

所以我试图通过我的模型传递数据(int-Array)...

namespace MvcApplication2.Models {
    public class Sudoku {
        public int[] numbers { get; set; }
    }
}

...,由控制器使用索引初始化...

namespace MvcApplication2.Controllers
{
    public class SudokuController : Controller
    {
        //
        // GET: /Sudoku/

        [HttpGet]
        public ActionResult Index()
        {
            Sudoku sudoku = new Sudoku();

            int[] numbers = new int[81];
            for (var i = 0; i < 81; i++) {
                numbers[i] = i;
            }
            sudoku.numbers = numbers;

            return View(sudoku);
        }
    }
}

...通过视图...

@model MvcApplication2.Models.Sudoku
@{
    ViewBag.Title = "Sudoku";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h1>Sudoku</h1>

<div class="sudoku"></div>

@section scripts {
    <script id="script1" src="~/Scripts/render_sudoku.js" type="text/javascript" data-numbers=@Model.numbers></script>
}

...放入我的JavaScript文件中,我只想将其用作数组。

但是,当我尝试

console.log($('#script1').data("numbers"));

我只能得到

System.Int32[]

作为答案,似乎是一个仅描述格式的字符串。

是否可以在JavaScript文件中使用实际的数组?

我是MVC的新手,无法完全掌握它。

3 个答案:

答案 0 :(得分:2)

  

问题:@ Model.numbers是int对象的列表,因此它显示您无法像这样访问的字符串值,因为它将转换为对象字符串。

解决方案:上面的答案是正确的,但是如果您想像下面这样访问数组的直接JavaScript变量, 您可以将int字符串数组设置为java-script变量,如下所示。

   <script>
        var sudokuNumbers = [@string.Join(",", Model.numbers)]
   </script>

不需要在JavaScript中将字符串拆分为数组。

现在您可以访问sudokuNumbers,此变量是javascript数组。 您可以访问其价值。 希望对您有帮助。

答案 1 :(得分:1)

我建议您将数字列表作为变量传递给脚本部分,而不要将其设置为其中的标签的数据属性。然后,您可以在脚本中使用该变量。

您认为:

@section scripts {
    <script>
        var mynumbers = "@string.Join(",", Model.numbers)";
    </script>
    <script id="script1" src="~/Scripts/render_sudoku.js" type="text/javascript"></script>
}

在您的脚本中:

var numbers = mynumbers.split(",");
for (var i in numbers)
{
    var number = numbers[i];
    // DO WHATEVER
}

编辑:您需要将Javascript变量的声明放在引号中,否则会出现ESLint解析错误。

答案 2 :(得分:0)

做到这一点的最佳方法IMO是通过Framework中的序列化程序进行的,该序列化程序可以处理几乎所有内容,而不仅仅是数组。这样,您就不必担心格式的详细信息,转义序列,特殊情况等。

在视图中:

@using System.Web.Script.Serialization
@{
    var serializer = new JavaScriptSerializer();
}
<script>
    var numbers = @Html.Raw(serializer.Serialize(Model.numbers));
</script>