2017-10-09 111 views
0

我了JavaScript我的下面的代碼片段我摔跤:創建一個鍵/值對foreach循環

window.bvCallback = function (BV) { BV.pixel.trackTransaction({ 
    "currency" : "value", 
    "orderId" : "@Model.Order.OrderNumber", 
    "total" : "@Model.Order.Total", 
    "items" : [ 
    { -->need a foreach here to loop through the collection to make this key/value pairing for each item 
    "price" : "value", 
    "quantity" : "value", 
    "sku" : "value" 
    } 
    ] 
}); 
}; 

我的問題是與"items" : []線。我有一個需要重複創建價格數量和SKU值的集合。這個片段將致力於迭代的項目:

foreach (var item in Model.Order.LineItems) {item.AdjustedUnitPrice item.sku ...}; 

所以我的最終結果需要如下:

..."items" : [ 
{ 
    "price" : "140", 
    "quantity" : "1", 
    "sku" : "156278" 

}, 
{ 
    "price" : "12.69", 
    "quantity" : "3", 
    "sku" : "908736" 
}]... 

所以我能得到我的LineItems收集所需要的,我只是」的值t似乎把以上的關鍵/價值配對的foreach拿到我需要的時候。

+2

你可以執行foreach循環來創建你的集合_then_分配給'items'。 – Jasen

+0

它是否在一個cshtml文件中? –

+0

解釋Jasen的評論:'var items = [];運行你的for循環並將物體推到物品上; ... trackTransaction({... items:items,....})' – SethWhite

回答

0

如果可能的話,在C#代碼中設置模型,而不是在視圖中。

public class Transaction 
{ 
    public decimal Currency { get; set; } 
    public int OrderId { get; set; } 
    ... 
    public List<Item> Items { get; set; } 
} 

public class Item 
{ 
    public decimal Price { get; set; } 
    public int Quantity { get; set; } 
    public string Sku { get; set; } 
} 

public ActionResult Transaction(string id) 
{ 
    var transaction = service.GetTransaction(id); 
    return View(transaction); 
} 

那麼你的觀點只是具有輔助

@model Transaction 

<script> 
    var transaction = @Html.Raw(Json.Encode(Model)); 
    window.bvCallback = function(BV) { BV.pixel.trackTransaction(transaction); };   
</script> 

如果你仍然想建立與您的方法的對象,只是分配items你執行一個循環之後。

<script> 
window.window.bvCallback = function (BV) { 

    var items = []; 

    @foreach (var i in Model.Order.LineItems) 
    { 
     var item = Html.Raw(Json.Encode(new { price = i.AdjustedUnitPrice, ... })); 

     <text> 
     items.push(@item); 
     </text> 
    } 

    var transaction = { 
     "currency" : "value", 
     "orderId" : "@Model.Order.OrderNumber", 
     "total" : "@Model.Order.Total", 
     "items" : [], // or just assign it here 
     ... 
    }; 

    transaction.items = items; 

    BV.pixel.trackTransaction(transaction); 
}; 
</script> 

將JavaScript和Razor混合可以很快變得醜陋。但第一個示例將混合保持爲絕對最小值,而在第二個示例中很難看出Razor結束和JavaScript開始的位置。

+0

有一個視圖已經在C#中,問題是我只需要特定值從視圖。部分選項效果很好。謝謝。 – john