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("...");
}
Совокупное исключение, которое содержит одно или несколько вспомогательных исключений, будет по-прежнему быть брошенным в конце.
Это зависит от вызывающей среды.Вы можете прямо вставлять значения в 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
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>
Многие из этих ответов действительно работают, но я нашел самый простой способ отправить данные через 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 для клиента.
Для тех, кто пытается это сделать, не используя JSON, следующее, как я это сделал:
<script>
var originalLabels = [ '@Html.Raw(string.Join("', '", Model.labels))'];
</script>
Я бы сказал, что это больше проблема того, как вы моделируете свои данные. Вместо использования строковых массивов для адресов было бы намного проще и проще сделать что-то вроде этого:
Создайте класс для представления ваших адресов, например:
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"}]
Это работало для меня в ASP.NET Core MVC.
<script type="text/javascript">
var ar = @Html.Raw(Json.Serialize(Model.Addresses));
</script>
Вот как вы это достигаете:
//View.cshtml
<script type="text/javascript">
var arrayOfArrays = JSON.parse('@Html.Raw(Json.Encode(Model.Addresses))');
</script>
Много способов для 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>
List
, но в вопросе это строка, разделенная запятыми. Тем не менее, я бы сразу отправил список в представление и дал представление обработать это, сделав то, что опубликовал Мехул, но только в одной строке.
– Andrew
8 August 2018 в 14:58
@Html.Raw(Json.Encode(Model.Addresses))
– Nate-Wilkins 27 August 2013 в 17:30