2012-06-12 77 views
2

我在我的HTML代码的下面一行:如何访问模式阵列中的jQuery函数

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

这里,BgtArray是一个2-d阵列获取的观点本身填充。事情是这样的:

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

如何访问数组的元素在一个jQuery功能?

回答

3

您正在视图内填充模型? 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"/> 

这是不太可能是你想要实现的。

+0

嘿达林。非常感谢您的回复。然而,即时通讯运行您的代码时出现以下错误:在序列化类型为“System.Reflection.RuntimeModule”的对象时检测到循环引用。它发生在这一行:var model = @ Html.Raw(Json.Encode(Model)); – PabloB

+0

这是因为你有循环引用。您不能使用循环引用序列化对象图。我建议你使用视图模型,而不是将你的领域模型传递给视图,并打破这个循环引用。 –

1

为了解决循环引用的问题(在回答下面的意见对原来的问题提到的),我用这个代替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