Как передать список строк в javascript с помощью Razor на ASP.NET MVC? [Дубликат]

Forward Warning

Просто быстрый хэдшоп для тех, кто посещает этот и другие подобные темы, ищет способ распараллеливать EntityFramework с помощью async + await + task tool-set: Образец, показанный здесь, звучит, однако, когда дело доходит до специальной снежинки EF, вы не достигнете параллельного выполнения, если только до тех пор, пока вы не будете использовать отдельный (новый) db-context-экземпляр внутри каждого вызова * Async ().

Этот вид что необходимо из-за присущих дизайну ограничений ef-db-контекстов, которые запрещают одновременное выполнение нескольких запросов в одном экземпляре ef-db-context.


Воспользовавшись уже предоставленными ответами, это это способ убедиться, что вы собираете все значения даже в том случае, если одна или несколько задач приводят к исключению:

    var car = (Car) null;
    var cat = (Cat) null;
    var house = (House) null;
    using (var carTask = BuyCarAsync())
    using (var catTask = FeedCatAsync())
    using (var houseTask = SellHouseAsync())
    {
        try {
              await Task.WhenAll(carTask, catTask, houseTask);
        } finally {
              car = carTask.Status == TaskStatus.RanToCompletion ? await carTask : null;
              cat = catTask.Status == TaskStatus.RanToCompletion ? await catTask : null;
              house = houseTask.Status == TaskStatus.RanToCompletion ? await houseTask : null;
        }

        if (cat == null || car == null || house == null)
            throw new SomethingFishyGoingOnHereException("...");
   }

Совокупное исключение, которое содержит одно или несколько вспомогательных исключений, будет по-прежнему быть брошенным в конце.

Это зависит от вызывающей среды.

27
задан aaron.bynum 27 August 2013 в 17:16
поделиться

8 ответов

Вы можете прямо вставлять значения в 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

38
ответ дан Romoku 18 August 2018 в 23:50
поделиться
  • 1
    Я думаю, вам нужно кодировать модель Json: @Html.Raw(Json.Encode(Model.Addresses)) – Nate-Wilkins 27 August 2013 в 17:30
  • 2
    Я думал, что он уже кодирует его внутри своего контроллера. – Romoku 27 August 2013 в 17:32
  • 3
    хороший момент. – Nate-Wilkins 27 August 2013 в 17:33
  • 4
    Когда я проверяю строку на контроллере, это выглядит так: [[\ & quot; 123 Street St. \ & Quot; \ & quot; City \ & quot; \ & quot; CA \ & quot; \ & quot; 12345 \ & quot;], ...], которая является правильной строкой JSON. Когда я печатаю строку на консоли в Chrome, она выглядит так: [[& amp; quot; 123 Street St. & quot; & amp; quot; City & amp; quot; & amp; quot; CA & amp; quot; & amp; quot; & amp; 12345 & amp; quot;], ...] Когда я перекодирую его с помощью Json.Encode, а затем попытаюсь проанализировать его с помощью JSON.parse (например, это - JSON.parse ('@ Html.Raw (Json.Encode (Model.Addresses)) '), я получаю следующую ошибку в консоли: & quot; Невыпущенный SyntaxError: Неожиданный номер & quot; – aaron.bynum 27 August 2013 в 17:47
  • 5
    Когда вы можете печатать строку на CSHTML, вам не нужно делать JSON.parse, вы можете просто назначить строку JSON переменной. JSON - это действительный объект JavaScript в любом случае. – Akash Kava 27 August 2013 в 18:41

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>
0
ответ дан Akash Kava 18 August 2018 в 23:50
поделиться

Многие из этих ответов действительно работают, но я нашел самый простой способ отправить данные через 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, поскольку он просто написан на сервере с сервера.

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

10
ответ дан Charles Burns 18 August 2018 в 23:50
поделиться

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

<script>
    var originalLabels = [ '@Html.Raw(string.Join("', '", Model.labels))'];
</script>
2
ответ дан Hashim Akhtar 18 August 2018 в 23:50
поделиться

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

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

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"}]
2
ответ дан Jedediah 18 August 2018 в 23:50
поделиться
  • 1
    Я уверен, что ты прав. Единственная проблема заключается в том, что мой исходный код работает GREAT в не MVC ASP.NET. Не было никаких проблем, пока я не попытался реализовать одно и то же решение в MVC. Я буду придерживаться своего «нового». решение использования $ .getJSON () для получения результата действия JsonResult. Если это не сработает, я буду смотреть на ваше решение гораздо ближе. Благодаря! – aaron.bynum 27 August 2013 в 18:08

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

<script type="text/javascript">
    var ar = @Html.Raw(Json.Serialize(Model.Addresses));
</script>
2
ответ дан John81 18 August 2018 в 23:50
поделиться

Вот как вы это достигаете:

//View.cshtml
<script type="text/javascript">
    var arrayOfArrays = JSON.parse('@Html.Raw(Json.Encode(Model.Addresses))');
</script>
0
ответ дан Jules Dupont 18 August 2018 в 23:50
поделиться

Много способов для 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>
17
ответ дан Mehul Bhalala 18 August 2018 в 23:50
поделиться
  • 1
    Я понятия не имею, почему это был не ответ – BoundForGlory 17 May 2016 в 13:46
  • 2
    Потому что он был опубликован через три года после того, как вопрос был первоначально задан. – aaron.bynum 29 July 2017 в 16:08
  • 3
    Кстати, отсутствует функция закрытия фигурной скобки после функции for (). – Leo 29 September 2017 в 11:39
  • 4
    И поскольку здесь объект модели является List, но в вопросе это строка, разделенная запятыми. Тем не менее, я бы сразу отправил список в представление и дал представление обработать это, сделав то, что опубликовал Мехул, но только в одной строке. – Andrew 8 August 2018 в 14:58
Другие вопросы по тегам:

Похожие вопросы: