2012-06-12 2 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

Это потому, что у вас есть круглые ссылки. Вы не можете JSON сериализовать графы объектов с круговыми ссылками. Я бы рекомендовал вам использовать модель представления вместо того, чтобы передавать ваши модели домена в представления и нарушать эту циркулярную ссылку. –

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

Смежные вопросы