首页 > 解决方案 > c# 循环遍历列表以将数据传递给 SendGrid 模板

问题描述

我正在使用模板通过 SendGrid 发送订单确认。我正在努力的地方是生成 JSON 并将其传递给 SendGrid 中的模板。任何帮助表示赞赏。

我的控制器:

    var apiKey = ConfigurationManager.AppSettings["SGAPIkey"];
    var client = new SendGridClient(apiKey);
    var msg = new SendGridMessage();
    msg.SetFrom(new EmailAddress("orders@freshNclean.ch", "freshNclean"));
    msg.AddTo(new EmailAddress(UserManager.FindById(userID).Email));
    msg.SetTemplateId("d-9f76f10c08964219954067b31b3a97ad");

    var orderedLineItems = DATADB.LineItemList.Where(x => x.OrderNumber == orderID).ToList();

    string prd;
    int qty;
    decimal prc;
    foreach (var item in orderedLineItems)
    {
        if (item.SubscriptionQuantity == 0)
        {
            prd = item.ProductName;
            qty = item.SingleOrderQuantity;
            prc = item.SingleOrderPrice;
        }
        else
        {
            prd = item.ProductName;
            qty = item.SubscriptionQuantity;
            prc = item.SubscriptionPrice;
        }
        var body = new orderConfirmation
        {
            receipt = true,
            lineItem = new lineItem
            {
                product = prd,
                quantity = qty,
                //price = prc
            },
            total = "CHF " + order.OrderAmount.ToString(),
            company = DATADB.ShippingAddressList.Where(x => x.UserID == userID).Where(x => x.IsDefaultShippingAddress == true).Select(x => x.ShippingAddressCompanyName).First(),
            name = UserManager.FindById(userID).FirstName.ToString() + " " + UserManager.FindById(userID).LastName.ToString(),
            address01 = DATADB.ShippingAddressList.Where(x => x.UserID == userID).Where(x => x.IsDefaultShippingAddress == true).Select(x => x.ShippingAddressStreet).First() + " " + DATADB.ShippingAddressList.Where(x => x.UserID == userID).Where(x => x.IsDefaultShippingAddress == true).Select(x => x.ShippingAddressNumber).First(),
            address02 = DATADB.ShippingAddressList.Where(x => x.UserID == userID).Where(x => x.IsDefaultShippingAddress == true).Select(x => x.ShippingAddressAdditional).First(),
            zip = DATADB.ShippingAddressList.Where(x => x.UserID == userID).Where(x => x.IsDefaultShippingAddress == true).Select(x => x.ShippingAddressZIP).First(),
            city = DATADB.ShippingAddressList.Where(x => x.UserID == userID).Where(x => x.IsDefaultShippingAddress == true).Select(x => x.ShippingAddressCity).First(),
            state = DATADB.ShippingAddressList.Where(x => x.UserID == userID).Where(x => x.IsDefaultShippingAddress == true).Select(x => x.ShippingAddressState).First(),
            instructions = DATADB.ShippingAddressList.Where(x => x.UserID == userID).Where(x => x.IsDefaultShippingAddress == true).Select(x => x.ShippingInstructions).First()
        };
        msg.SetTemplateData(body);
    };
    var response = /*await*/ client.SendEmailAsync(msg);


private class orderConfirmation
    {
        [JsonProperty("subject")]
        public string subject { get; set; }
        [JsonProperty("receipt")]
        public bool receipt { get; set; }

        [JsonProperty("company")]
        public string company { get; set; }
        [JsonProperty("name")]
        public string name { get; set; }
        [JsonProperty("address01")]
        public string address01 { get; set; }
        [JsonProperty("address02")]
        public string address02 { get; set; }
        [JsonProperty("zip")]
        public string zip { get; set; }
        [JsonProperty("city")]
        public string city { get; set; }
        [JsonProperty("state")]
        public string state { get; set; }
        [JsonProperty("instructions")]
        public string instructions { get; set; }

        [JsonProperty("lineItem")]
        public lineItem lineItem { get; set; }

        [JsonProperty("total")]
        public string total { get; set; }
    }
    private class lineItem
    {
        [JsonProperty("product")]
        public string product { get; set; }
        [JsonProperty("quantity")]
        public int quantity { get; set; }
        [JsonProperty("price")]
        public decimal price { get; set; }
    }

SendGrid 模板上的代码如下所示:

{{#each lineItem}}



<tr>



  <td style="width:500px;max-width:85%;"><div style="text-align: left;color:#000e56">{{lineItem.product}}</div></td>

  <td style="width:30px;max-width:4.5%;"><div style="text-align: right;color:#000e56">{{lineItem.quantity}}x</div></td>

  <td style="width:70px;max-width:15.5%;"><div style="text-align: right;color:#000e56">CHF {{lineItem.price}}</div></td>

</tr>



{{/each}}

我的问题是我没有得到模板中的所有订单项,而是列出了 3 倍的相同订单项。根据我通过测试发现的情况,这可能与我试图为每个订单项传递的 3 个值(产品、数量、价格)有关。关于我在哪里出错的任何建议?

标签: c#jsonasp.net-mvcforeachsendgrid

解决方案


您将TemplateData设置为仅最后一个订单,您应该为其分配orderConfirmation列表,因此将 foreach 循环替换为以下代码:

var allLines=new List<orderConfirmation>();
foreach (var item in orderedLineItems)
{
    if (item.SubscriptionQuantity == 0)
    {
        prd = item.ProductName;
        qty = item.SingleOrderQuantity;
        prc = item.SingleOrderPrice;
    }
    else
    {
        prd = item.ProductName;
        qty = item.SubscriptionQuantity;
        prc = item.SubscriptionPrice;
    }
    var body = new orderConfirmation
    {
        receipt = true,
        lineItem = new lineItem
        {
            product = prd,
            quantity = qty,
            //price = prc
        },
        total = "CHF " + order.OrderAmount.ToString(),
        company = DATADB.ShippingAddressList.Where(x => x.UserID == userID).Where(x => x.IsDefaultShippingAddress == true).Select(x => x.ShippingAddressCompanyName).First(),
        name = UserManager.FindById(userID).FirstName.ToString() + " " + UserManager.FindById(userID).LastName.ToString(),
        address01 = DATADB.ShippingAddressList.Where(x => x.UserID == userID).Where(x => x.IsDefaultShippingAddress == true).Select(x => x.ShippingAddressStreet).First() + " " + DATADB.ShippingAddressList.Where(x => x.UserID == userID).Where(x => x.IsDefaultShippingAddress == true).Select(x => x.ShippingAddressNumber).First(),
        address02 = DATADB.ShippingAddressList.Where(x => x.UserID == userID).Where(x => x.IsDefaultShippingAddress == true).Select(x => x.ShippingAddressAdditional).First(),
        zip = DATADB.ShippingAddressList.Where(x => x.UserID == userID).Where(x => x.IsDefaultShippingAddress == true).Select(x => x.ShippingAddressZIP).First(),
        city = DATADB.ShippingAddressList.Where(x => x.UserID == userID).Where(x => x.IsDefaultShippingAddress == true).Select(x => x.ShippingAddressCity).First(),
        state = DATADB.ShippingAddressList.Where(x => x.UserID == userID).Where(x => x.IsDefaultShippingAddress == true).Select(x => x.ShippingAddressState).First(),
        instructions = DATADB.ShippingAddressList.Where(x => x.UserID == userID).Where(x => x.IsDefaultShippingAddress == true).Select(x => x.ShippingInstructions).First()
    };
  allLines.Add(body);
};
msg.SetTemplateData(allLines);

推荐阅读