Как перебрать @Model.ICollection в функции Java Script?

У меня есть @Model.LoginCoordinates где LoginCoordinates является ICollection<Coordinates>,

Coordinates учебный класс:

public class Coordinates {
    public int Id { get; set; }
    public double Latitude { get; set; }
    public double Longitude { get; set; }
}

Внутри вид у меня есть:

<script>
    function f(){
       for (var i = 0, n  = @Model.LoginCoordinates.Count; i < n; i++) {
                    alert(i);//works fine, I just wanted to check if the loop works at all
       }
    }
</script>

Он работает нормально, но вместо этого я хотел бы отобразить все, что нужно сделать:

 <script>
     function f(){
          for (var i = 0, n  = @Model.LoginCoordinates.Count; i < n; i++) {
                  var latitute = @Model.LoginCoordinates[i].Latitude;
                  var longituted = @Model.LoginCoordinates[i].Longitude;
         }
     }
</script>

Но я не могу получить доступ i элемент LoginCoordinates потому что это так ICollection, Также я верю, что foreach невозможен - это объект C#.

Вопрос: как перебрать ICollection внутри JavaScript?

РЕДАКТИРОВАТЬ

Это выше SSCCE, реальный код:

  var map;
    function InitializeMap() {
        alert('works');
        var lat = @Model.LoginCoordinates.First().Latitude;
        var lon = @Model.LoginCoordinates.First().Longitude;
        var latlng = new google.maps.LatLng(lat, lon);
        var mapOptions =
        {
            zoom: 16,
            center: latlng,
            mapTypeId: google.maps.MapTypeId.ROADMAP,
            disableDefaultUI: true
        };
        map = new google.maps.Map(document.getElementById("map"), mapOptions); //this breaks the script

    }
    window.addEventListener('load', InitializeMap);

4 ответа

Решение

Это должно сделать это с помощью JsonConvert от newtonsoft.json

<script>
var coordinatesJson='@Html.Raw(JsonConvert.Serialize(Model.LoginCoordinates.ToArray())'

var coordinates=JSON.parse(coordinatesJson);

//you now have coordinates as javascript  object

var map;
function InitializeMap() {
    // could loop over if needed
     for(var coords in coordinates) {
        // do something with coords
     }
</script>

Как насчет

<script>
 function f(){
     var coordinates= @Model.LoginCoordinates.ToArray();
     for (var i = 0, n  = coordinates.Length; i < n; i++) {
              var latitute = coordinates[i].Latitude;
              var longituted = coordinates[i].Longitude;
     }
 }
</script>

Модель доступна только на стороне сервера во время визуализации представления. Поэтому, чтобы получить доступ к его свойствам на стороне клиента, вам нужно будет выполнить итерацию по коллекции в C# (бритва) и сгенерировать HTML-код, к которому затем сможет обращаться код JavaScript на стороне клиента.

Другой альтернативой может быть создание метода контроллера, который возвращает модель в виде JSON и вызывает ее из кода на стороне клиента через AJAX.

Для чего это стоит, этот синтаксис может быть полезен для кого-то:

      @section Scripts {
      <script type="text/javascript">  
        @if (Model.LoginCoordinates.Any())
        {
            //C# loop over C# object
            foreach (var point in Model.LoginCoordinates)
            {
                //We are mixing C# and JS code here
                //you could call google's JS API, but still work with C# object properties
                @:console.log(@point.Latitude, @point.Longitude);
            }
        }
      </script>
     }
Другие вопросы по тегам