c# - 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 个值(产品、数量、价格)有关。关于我在哪里出错的任何建议?
解决方案
您将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);
推荐阅读
- python - 如何帮助mypy理解“if isinstance else”结构?
- java - Android 没有达到 try catch 中的“else”语句
- jquery - 如何使用 amchart 添加多条曲线取决于您的独特数据
- css - 使用 SCSS 计算字体大小 REM - 数字后的空格
- powershell - 使用管道时,Powershell 无法解析 ParameterSetName
- c++ - 为什么多个元素没有插入到一组结构中?
- php - php多维数组获取特定类别的价格
- amazon-web-services - 为什么我应该使用预签名的 url
- c# - 引导错误消息在 IIS 服务器中不起作用
- c# - 如何将参数传递给控制器的 @renderpage 调用?