Как привязать модель к сеансу в ASP MVC Core - PullRequest
0 голосов
/ 21 мая 2019

Я привязываю модель к сеансу в ASP MVC Framework следующим образом:

 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;
        }

У меня также есть класс для поставщика связывателя модели.

Но я получаю сообщение об ошибке во время выполнения, говоря, что объект является нулевым:

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

Строкавозвращено из 'GetString (sessionKey)' является нулевым.Полное сообщение:

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

1 Ответ

0 голосов
/ 21 мая 2019

В вопросе не упоминается, какое исключение выдается, но этот код гарантированно завершится ошибкой при первой попытке чтения из сеанса.

Второй фрагмент пытается десериализовать строку, не проверяя, является ли она нулевой или нет:

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

Или, более читабельным образом:

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

JsonConvert.DeserializeObject() сгенерирует, если его аргумент нулевой.

Строка json должна быть проверена перед тем, как вызовет DeserializeObject. При некоторой очистке код может выглядеть так:

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;

Это вернет ноль, если какой-либо из объектов будет ноль.

...