【问题标题】:How to access model array in a Jquery function如何在 Jquery 函数中访问模型数组
【发布时间】:2012-06-14 23:53:38
【问题描述】:

我的 HTML 代码中有以下行:

<input type="hidden" value="@Model.BgtArray" id="BudgetArray"/>

这里,BgtArray 是一个二维数组,它被填充到视图本身中。像这样的:

@for(i=0;i<10;i++)
{@for (j=0;j<10;j++)
   @Model.BgtArray[i][j]= *some value*;
}

如何在 jQuery 函数中访问该数组的元素?

【问题讨论】:

    标签: jquery asp.net-mvc-3 model-view-controller


    【解决方案1】:

    您正在视图中填充模型????在 MVC 模式中,视图旨在显示以模型形式传递给它们的数据。填充此模型是控制器的责任。

    话虽如此,让我们假设您有一个模型:

    public class MyViewModel
    {
        public int[][] BgtArray { get; set; }
    }
    

    在控制器动作中填充并传递给视图:

    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            var model = new MyViewModel
            {
                BgtArray = Enumerable
                    .Range(1, 10)
                    .Select(
                        i => Enumerable
                                .Range(1, 10)
                                .Select(j => i * j)
                                .ToArray()
                    )
                    .ToArray()
            };
            return View(model);
        }
    }
    

    然后我们可以有一个对应的强类型视图,我们可以在其中 JSON 序列化模型并在 javascript 中访问它:

    @model MyViewModel
    <script type="text/javascript">
        var model = @Html.Raw(Json.Encode(Model));
        alert(model.BgtArray[1][2]);
    </script>
    

    这将在浏览器中呈现如下:

    <script type="text/javascript">
        var model = {"BgtArray":[[1,2,3],[2,4,6],[3,6,9]]};
        alert(model.BgtArray[1][2]);
    </script>
    

    就以下行而言:

    <input type="hidden" value="@Model.BgtArray" id="BudgetArray"/>
    

    它非常没用,因为您无法将整个复杂对象图存储到隐藏字段中。渲染结果将是:

    <input type="hidden" value="System.Int32[][]" id="BudgetArray"/>
    

    这不太可能是您想要实现的目标。

    【讨论】:

    • 嘿达林。非常感谢您的回复。但是,我在运行代码时遇到以下错误:序列化“System.Reflection.RuntimeModule”类型的对象时检测到循环引用。它出现在这一行: var model = @Html.Raw(Json.Encode(Model));
    • 那是因为你有循环引用。您不能使用循环引用对对象图进行 JSON 序列化。我建议您使用视图模型,而不是将您的域模型传递给视图并打破此循环引用。
    【解决方案2】:

    为了解决循环引用的问题(在原始问题的答案下面的 cmets 中提到),我使用了这个而不是 Json.Encode

    @Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(Model))
    

    在你的类中,使用下面的注解让 Json 忽略引起问题的导航属性:

    [JsonIgnore]
    public virtual Item Item { get; set; }
    

    解决方案取自:Hide field in model when using @Json.Encode

    【讨论】:

      猜你喜欢
      • 2011-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多