Cara menggunakan data model dalam JavaScript: ASP.NET Core

Saya memiliki daftar objek yang berisi garis lintang dan bujur untuk posisi penanda. Ketika saya mencoba menyimpan daftar objek ke dalam var javascript dan membacanya dalam loop for, itu tidak menghasilkan apa-apa. Saya tidak tahu di mana kesalahannya. Apa yang saya coba lakukan adalah mengonversi daftar menjadi array, tetapi itu pun tidak membantu. Saya memeriksa nilai Model.Asparaguses dan semuanya baik-baik saja, jadi bukan itu masalahnya di sini.

Ini ViewModel saya:

public class FieldViewModel
{
    public Field Field { get; set; }
    public object[] ChartData { get; set; }
    public Asparagus[] Asparaguses { get; set; }
}

Ini kode .js saya di tampilan saya:

<script>
asparaguses = @Html.Raw(Json.Serialize(Model.Asparaguses));
</script>

Dan ini kode .js eksternal saya:

var asparaguses;

function initMap() {
    var map = new google.maps.Map(document.getElementById('map'), {
        center: { lat: 51.25202200, lng: 5.710260 },
        zoom: 15
    });

    for (var i = 0; i < asparaguses.length; i++) {
        // Create a marker and set its position.
        var marker = new google.maps.Marker({
            map: map,
            position: { lat: asparaguses[i].Lat, lng: asparaguses[i].Long }
        });
    }
};

EDIT:

Di konsol saya, saya mengalami kesalahan ini:

InvalidValueError: setPosition: bukan LatLng atau LatLngLiteral: di properti lat: bukan angka

Ketika saya mencatat array Asparagus maka saya mendapatkan output ini:

Asparagus: [Objek Objek],[Objek Objek],[Objek Objek],[Objek Objek],[Objek Objek],[Objek Objek]

Dan ketika saya mencatat nilai Lintang dan Bujur dari 1 asparagus, saya melihat bahwa nilainya 'Tidak Terdefinisi'. Tapi bagaimana caranya?


person Svenmarim    schedule 17.09.2018    source sumber
comment
Sudahkah Anda memeriksa apakah nilainya diterima dengan benar dari ViewModel Anda? Jadi langkah pertama adalah memverifikasi misalnya melalui log konsol sederhana bahwa var asparagus Anda di js Anda setelah menyetelnya berisi nilai yang Anda harapkan?   -  person Saltz    schedule 17.09.2018
comment
@Saltz ya, dalam model tampilan saya daftar asparagus sudah benar. Tetapi di konsol saya, saya sekarang melihat bahwa saya memiliki kesalahan ini: InvalidValueError: setPosition: not a LatLng atau LatLngLiteral: in property lat: not a number   -  person Svenmarim    schedule 18.09.2018
comment
Tampilkan keluaran konsol asparagus seperti console.log(asparaguses);   -  person Nisfan    schedule 18.09.2018
comment
@Nisfan di sini: Asparagus: [Objek Objek],[Objek Objek],[Objek Objek],[Objek Objek],[Objek Objek],[Objek Objek] Tetapi ketika saya mencatat variabel 1 asparagus maka nilainya adalah 'Tidak terdefinisi '   -  person Svenmarim    schedule 18.09.2018
comment
@Svenmarim Pertanyaan saya terjawab hanya dengan melihat pertanyaan Anda, Sobat. Saya ingin tahu cara meneruskan ViewModel ke Javascript eksternal dan pertanyaan Anda menjawab semuanya. Terimakasih kawan. :)   -  person Vyas Senthil    schedule 26.10.2020
comment
@VyasSenthil Saya senang ini membantu Anda haha   -  person Svenmarim    schedule 26.10.2020


Jawaban (2)


(Jawaban resmi berasal dari komentar saya)

Setelah menyediakan konten variabel melalui konsol, masalahnya menjadi jelas. Properti Anda yang ditentukan dalam model Anda ditulis di CamelCase atas seperti yang diinstruksikan oleh aturan pengkodean dan gaya .NET.

Namun JavaScript menggunakan notasi camelCase yang lebih rendah. Jadi ketika Anda secara paksa merujuk ke properti Anda di CamelCase atas, itu akan menghasilkan undefined.

Jadi dengan mengubah semua referensi yang dibuat ke properti Anda dalam notasi camelCase yang lebih rendah, masalah Anda akan teratasi.

TLDR

Gunakan notasi camelCase yang lebih rendah saat mengacu pada properti/bidang.

person Saltz    schedule 18.09.2018

Saya pikir alih-alih mengubah ke camel case di Viewmodel kelas c# Anda dapat menambahkan anotasi JSONProperty (menggunakan Newtonsoft.JSON) yang secara otomatis akan mengubah case bidang menjadi nama di jsonproperty sebelum membuat serial seperti ini

public class FieldViewModel
{
   [JsonProperty(PropertyName="field")]
   public Field Field { get; set; }

   [JsonProperty(PropertyName="chartData")]
   public object[] ChartData { get; set; }

   [JsonProperty(PropertyName="asparaguses")]
   public Asparagus[] Asparaguses { get; set; }
}

Alternatifnya, Anda dapat menggunakan ContractResolver yang akan mengubah semua bidang menjadi huruf besar-kecil yang benar. Lihat tautan CamelCaseContractResolver untuk informasi lebih lanjut

person user3785553    schedule 18.09.2018
comment
Saya pikir Anda tidak memahaminya dengan benar. Saya tidak perlu mengubah casing unta di model tampilan saya. Properti saya masih dengan huruf kapital. Tepat ketika saya REFER ke properti dalam Javascript saya perlu menggunakan huruf biasa. Jadi satu-satunya hal yang perlu saya ubah adalah ` asparaguses[i].Lat` menjadi asparaguses[i].lat - person Svenmarim; 18.09.2018