2017-10-09 152 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