如何将模型绑定到ASP MVC核心中的会话



我将模型绑定到ASP MVC框架中的会话:

 public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            Cart cart = null;

            if(controllerContext.HttpContext.Session != null)
            {
                cart = (Cart)controllerContext.HttpContext.Session[sessionKey];
            }

            if(cart == null)
            {
                cart = new Cart();
                if (controllerContext.HttpContext.Session != null)
                {
                    controllerContext.HttpContext.Session[sessionKey] = cart;
                }

            }
            return cart;
        }

现在我想在ASM MVC核心中做同样的事情,这是我的尝试:

public Task BindModelAsync(ModelBindingContext bindingContext)
        {
            Cart cart = null;
            if (bindingContext.HttpContext.Session != null)
            {
                cart = (Cart)JsonConvert.DeserializeObject(bindingContext.HttpContext.Session.GetString(sessionKey));
            }
            if (cart == null)
            {
                cart = new Cart();
                if (bindingContext.HttpContext.Session != null)
                {
                    bindingContext.HttpContext.Session.SetString(sessionKey, JsonConvert.SerializeObject(cart));
                }

            }
            return Task.CompletedTask;
        }

我也有模型活页夹提供商的课程。

,但我在此行上遇到了一个运行时错误,说对象为null:

cart = (Cart)JsonConvert.DeserializeObject(bindingContext.HttpContext.Session.GetString(sessionKey));

从" getString(sessionkey((返回的字符串为null。完整消息是:

System.ArgumentNullException: 'Value cannot be null. Parameter name: value''.

这个问题没有提及抛出了什么例外,但是该代码是第一次尝试从会话中读取的第一次。

第二片片段试图在不检查是否为null的情况下进行测试:

cart=(Cart)JsonConvert.DeserializeObject(bindingContext.HttpContext.Session.GetString(sessionKey));

或以更可读的方式:

var json=bindingContext.HttpContext.Session.GetString(sessionKey);
cart = (Cart)JsonConvert.DeserializeObject(json);

JsonConvert.DeserializeObject()如果其参数为null。

必须在调用 DeserializeObject之前检查json字符串。有了一些清理,代码看起来像这样:

var session=bindingContext.HttpContext.Session;
if(session == null)
{
    return null;
}
var json = sessio.GetString(sessionKey);
if (!String.IsNullOrWhitespace(json))
{
    var cart=JsonConvert.DeserializeObject<Cart>(json);
    return cart;
}
else
{  
    var emptyCart=new Cart();
    var value=JsonConvert.SerializeObject(emptyCart);
    session.SetString(sessionKey, value);
    return emptyCart;
}

无效操作员可用于处理缺失的上下文值,例如在测试过程中:

var session=bindingContext?.HttpContext?.Session;

如果任何对象为null,则将返回null。

相关内容

  • 没有找到相关文章

最新更新