Подтвердить что ты не робот

Как преобразовать список С# <string []> в массив Javascript?

У меня есть datatable, что я конвертирую в List, сериализуя его и передавая его в свое представление с помощью viewmodel.

Моя viewmodel выглядит так:

public class AddressModel
{
    public string Addresses { get; set; }
}

Мое действие контроллера выглядит следующим образом:

AddressModel lAddressGeocodeModel = new AddressGeocodeModel();
List<string[]> lAddresses = new List<string[]>();

string lSQL = " select Address1, CityName, StateCode, ZipCode " +
                      " from AddressTable  ";

// Convert the data to a List to be serialized into a Javascript array.
//{
...data retrieval code goes here...
//}
foreach (DataRow row in AddressTable.Rows)
{
    string[] lAddress = new string[5];
    lAddress[1] = row["Address1"].ToString();
    lAddress[2] = row["CityName"].ToString();
    lAddress[3] = row["StateCode"].ToString();
    lAddress[4] = row["ZipCode"].ToString();
    lAddresses.Add(lAddress);
}

lAddressGeocodeModel.UnitCount = lAddresses.Count().ToString();
// Here I'm using the Newtonsoft JSON library to serialize my List
lAddressGeocodeModel.Addresses = JsonConvert.SerializeObject(lAddresses);

return View(lAddressModel);

Тогда, на мой взгляд, я получаю следующую строку адресов:

[["123 Street St.","City","CA","12345"],["456 Street St.","City","UT","12345"],["789 Street St.","City","OR","12345"]]

Как я могу получить эту сериализованную строку, находящуюся в бритвенной модели, в массив javascript?

4b9b3361

Ответ 1

Вы можете прямо вставлять значения в JavaScript:

//View.cshtml
<script type="text/javascript">
    var arrayOfArrays = JSON.parse('@Html.Raw(Model.Addresses)');
</script>

См. JSON.parse, Html.Raw

В качестве альтернативы вы можете получить значения через Ajax:

public ActionResult GetValues()
{
    // logic
    // Edit you don't need to serialize it just return the object

    return Json(new { Addresses: lAddressGeocodeModel });
}

<script type="text/javascript">
$(function() {
    $.ajax({
        type: 'POST',
        url: '@Url.Action("GetValues")',
        success: function(result) {
            // do something with result
        }
    });
});
</script>

См. jQuery.ajax

Ответ 2

Много способов для Json Parse, но я нашел наиболее эффективный способ

 @model  List<string[]>

     <script>

         function DataParse() {
             var model = '@Html.Raw(Json.Encode(Model))';
             var data = JSON.parse(model);  

            for (i = 0; i < data.length; i++) {
            ......
             }

     </script>

Ответ 3

Многие из этих ответов действительно работают, но я нашел самый простой способ отправить данные через ViewData или ViewBag и позволить JSON.Net сериализовать его.

Я использую эту технику, когда Javascript необходим для генерации HTML перед загрузкой страницы или когда необходимо избегать накладных расходов AJAX:

В контроллере:

public ActionResult MyController()
{
    var addresses = myAddressesGetter();
    ViewData["addresses"] = addresses ;
    return View();
}

В представлении:

@section scripts {
<script type="text/javascript">
    var MyjavascriptAddresses: @Html.Raw(JsonConvert.SerializeObject(ViewData["addresses"])),
</script>
}

Вы всегда можете полагаться на JSON.NET, тогда как у некоторых браузеров есть плохая поддержка десериализации JSON. Еще одно преимущество над некоторыми методами в том, что вы можете видеть Javascript, используя ваш браузер View --> Source, поскольку он просто написан на сервере с сервера.

Обратите внимание, что в большинстве ситуаций Web API более элегантный способ получить JSON для клиента.

Ответ 4

Это работало для меня в ASP.NET Core MVC.

<script type="text/javascript">
    var ar = @Html.Raw(Json.Serialize(Model.Addresses));
</script>

Ответ 5

Я бы сказал, что это больше проблема того, как вы моделируете свои данные. Вместо использования строковых массивов для адресов было бы намного проще и проще сделать что-то вроде этого:

Создайте класс для представления ваших адресов, например:

public class Address
{
    public string Address1 { get; set; }
    public string CityName { get; set; }
    public string StateCode { get; set; }
    public string ZipCode { get; set; }
}

Затем в вашей модели просмотра вы можете заполнить эти адреса следующим образом:

public class ViewModel
{
    public IList<Address> Addresses = new List<Address>();

    public void PopulateAddresses()
    {
        foreach(DataRow row in AddressTable.Rows)
        {
            Address address = new Address
                {
                    Address1 = row["Address1"].ToString(),
                    CityName = row["CityName"].ToString(),
                    StateCode = row["StateCode"].ToString(),
                    ZipCode = row["ZipCode"].ToString()
                };
            Addresses.Add(address);
        }

        lAddressGeocodeModel.Addresses = JsonConvert.SerializeObject(Addresses);
    }
}

Что даст вам JSON, который выглядит так:

[{"Address1" : "123 Easy Street", "CityName": "New York", "StateCode": "NY", "ZipCode": "12345"}]

Ответ 6

Для тех, кто пытается это сделать, не используя JSON, вот как я это сделал:

<script>
    var originalLabels = [ '@Html.Raw(string.Join("', '", Model.labels))'];
</script>

Ответ 7

Вот как это сделать:

//View.cshtml
<script type="text/javascript">
    var arrayOfArrays = JSON.parse('@Html.Raw(Json.Encode(Model.Addresses))');
</script>

Ответ 8

JSON - это действительный объект JavaScript, в то время как вы сами печатаете сам JavaScript, вам не нужно дополнительно кодировать/расшифровывать JSON после его преобразования в JSON.

<script type="text/javascript">
    var addresses = @Html.Raw(Model.Addresses);
</script>

Следующее будет напечатано, и это действительно выражение JavaScript.

<script type="text/javascript">
    var addresses = [["123 Street St.","City","CA","12345"],["456 Street St.","City","UT","12345"],["789 Street St.","City","OR","12345"]];
</script>

Ответ 9

Для одного размерного массива

контроллер:

using Newtonsoft.Json;
var listOfIds = _dbContext.Countries.Where(x => x.Id == Country.USA).First().Cities.Where(x => x.IsCoveredByCompany).Select(x => x.Id).ToList();
string strArrayForJS = JsonConvert.SerializeObject(listOfIds); //  [1,2,6,7,8,18,25,61,129]
//Now pass it to the view through the model or ViewBag 

Посмотреть:

<script>
    $(function () {
        var myArray = @Model.strArrayForJS;
        console.log(myArray); // [1, 2, 6, 7, 8, 18, 25, 61, 129]
        console.log(typeof (myArray)); //object
    });
</script>