如何将模型绑定到 ASP MVC Core 中的会话
How to bind a model to a session in ASP MVC Core
我将模型绑定到 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 Core 中做同样的事情,这是我的尝试:
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;
}
我还有模型活页夹提供程序的 class。
但是我在这一行得到了 运行 次错误,说对象是空的:
cart = (Cart)JsonConvert.DeserializeObject(bindingContext.HttpContext.Session.GetString(sessionKey));
从'GetString(sessionKey)' 返回的字符串为空。完整消息是:
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;
如果任何对象为空,这将 return 为空。
我将模型绑定到 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 Core 中做同样的事情,这是我的尝试:
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;
}
我还有模型活页夹提供程序的 class。
但是我在这一行得到了 运行 次错误,说对象是空的:
cart = (Cart)JsonConvert.DeserializeObject(bindingContext.HttpContext.Session.GetString(sessionKey));
从'GetString(sessionKey)' 返回的字符串为空。完整消息是:
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;
如果任何对象为空,这将 return 为空。