如何在不引发null异常的情况下初始化列表字符串属性?

时间:2018-11-13 04:00:29

标签: javascript c# asp.net-mvc visual-studio square-connect

我有一个带有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);
    }

2 个答案:

答案 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
}