c # цикл по списку для передачи данных в шаблон SendGrid - PullRequest
0 голосов
/ 27 января 2019

Я работаю над подтверждением заказа, которое будет отправлено через 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 раза одну и ту же позицию в списке.Из того, что я выяснил при тестировании, это то, что это, вероятно, связано с тремя значениями, которые я пытаюсь передать для каждой позиции (продукт, количество, цена).Любой совет, где я иду не так?

1 Ответ

0 голосов
/ 27 января 2019

Вы устанавливаете 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);
...