我有一个带有jsonResult的MVC控制器,该控制器将会话购物车转移到Squares CreateOrderRequestLineItem列表,但是当我初始化列表时,代码会抛出数量为null的异常,因为这是必需属性。我已经映射了数量,甚至直接将其设置为字符串值,我设置了属性数量,但是在代码甚至未映射之前就引发了null异常。我是否需要将数量设置为不为null或在某处为null的情况下为0?这是我的控制器代码。
会话购物车根据产品类别和产品模型以及产品编号,名称,数量,价格和税款的设置值来构建购物车。
如果在我的代码无法到达映射之前引发空异常,该如何映射到新列表?
注意:我已经添加了另一个List ItemDetail,以在已经抛出null异常错误之后传输会话数据,但这也不起作用。
注意二:当我不使用Square对象引用,而只使用通用列表并返回json时,我的购物车中的每个商品的数量都没有显示空值。
public JsonResult CheckoutRequest(string id)
{
List<Item> cart = (List<Item>)Session["cart"];
List<ItemDetails> itemDetails = cart.Select(s => new ItemDetails
{
ProductID = Convert.ToInt32(s.Product.ProductID),
Name = s.Product.Name,
Price = s.Product.Price,
Quantity = Convert.ToString(s.Quantity)
}).ToList();
var lineItems = itemDetails.Select(s => new CreateOrderRequestLineItem()
{
Quantity = "1",
Name = s.Name,
BasePriceMoney = new Money
{
Amount = s.Price,
Currency = Money.CurrencyEnum.USD,
},
CatalogObjectId = Convert.ToString(s.ProductID),
}).ToList();
CreateOrderRequest order = new CreateOrderRequest
{
ReferenceId = Convert.ToString(Guid.NewGuid()),
LineItems = lineItems
};
// Configuration.Default.AccessToken = "YOUR_ACCESS_TOKEN";
var body = new CreateCheckoutRequest
{
IdempotencyKey = Convert.ToString(Guid.NewGuid()),
Order = order,
AskForShippingAddress = true,
MerchantSupportEmail = "americanapparelusa@aol.com"
};
return Json(new
{
locationId,
body
}, JsonRequestBehavior.AllowGet);
}
答案 0 :(得分:1)
请更改以下内容
List<Item> cart = (List<Item>)Session["cart"];
进入
List<Item> cart = new List<Item>();
if (Session["cart"] != null && Session["cart"].ToString() != null && Session["cart"].ToString() != "")
{
cart = JsonConvert.DeserializeObject<List<Item>>(Session["cart"].ToString());
}
答案 1 :(得分:0)
如果Session
变量包含可能具有空值的List<Item>
,则应使用as
运算符,然后检查空值:
var cart = Session["cart"] as List<Item>;
if (cart == null)
{
// do something
}
else
{
// use mapping here
}
但是,如果Session
变量包含JSON数据,则可以尝试投射为string
类型,并在可用时反序列化它:
List<Item> cart = new List<Item>();
if (!string.IsNullOrEmpty(Session["cart"] as string))
{
cart = JsonConvert.DeserializeObject<List<Item>>(Session["cart"].ToString());
// use mapping here
}
else
{
// do something else
}